1 | use core::ffi::{c_int, c_ulong, c_void};
|
2 | use core::num::NonZeroU32;
|
3 | use core::ptr::NonNull;
|
4 |
|
5 | /// Raw display handle for Xlib.
|
6 | #[non_exhaustive ]
|
7 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
8 | pub struct XlibDisplayHandle {
|
9 | /// A pointer to an Xlib `Display`.
|
10 | ///
|
11 | /// It is strongly recommended to set this value, however it may be set to
|
12 | /// `None` to request the default display when using EGL.
|
13 | pub display: Option<NonNull<c_void>>,
|
14 |
|
15 | /// An X11 screen to use with this display handle.
|
16 | ///
|
17 | /// Note, that X11 could have multiple screens, however
|
18 | /// graphics APIs could work only with one screen at the time,
|
19 | /// given that multiple screens usually reside on different GPUs.
|
20 | pub screen: c_int,
|
21 | }
|
22 |
|
23 | impl XlibDisplayHandle {
|
24 | /// Create a new handle to a display.
|
25 | ///
|
26 | ///
|
27 | /// # Example
|
28 | ///
|
29 | /// ```
|
30 | /// # use core::ffi::c_void;
|
31 | /// # use core::ptr::NonNull;
|
32 | /// # use raw_window_handle::XlibDisplayHandle;
|
33 | /// #
|
34 | /// let display: NonNull<c_void>;
|
35 | /// let screen;
|
36 | /// # display = NonNull::from(&()).cast();
|
37 | /// # screen = 0;
|
38 | /// let handle = XlibDisplayHandle::new(Some(display), screen);
|
39 | /// ```
|
40 | pub fn new(display: Option<NonNull<c_void>>, screen: c_int) -> Self {
|
41 | Self { display, screen }
|
42 | }
|
43 | }
|
44 |
|
45 | /// Raw window handle for Xlib.
|
46 | #[non_exhaustive ]
|
47 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
48 | pub struct XlibWindowHandle {
|
49 | /// An Xlib `Window`.
|
50 | pub window: c_ulong,
|
51 | /// An Xlib visual ID, or 0 if unknown.
|
52 | pub visual_id: c_ulong,
|
53 | }
|
54 |
|
55 | impl XlibWindowHandle {
|
56 | /// Create a new handle to a window.
|
57 | ///
|
58 | ///
|
59 | /// # Example
|
60 | ///
|
61 | /// ```
|
62 | /// # use core::ffi::c_ulong;
|
63 | /// # use raw_window_handle::XlibWindowHandle;
|
64 | /// #
|
65 | /// let window: c_ulong;
|
66 | /// # window = 0;
|
67 | /// let mut handle = XlibWindowHandle::new(window);
|
68 | /// // Optionally set the visual ID.
|
69 | /// handle.visual_id = 0;
|
70 | /// ```
|
71 | pub fn new(window: c_ulong) -> Self {
|
72 | Self {
|
73 | window,
|
74 | visual_id: 0,
|
75 | }
|
76 | }
|
77 | }
|
78 |
|
79 | /// Raw display handle for Xcb.
|
80 | #[non_exhaustive ]
|
81 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
82 | pub struct XcbDisplayHandle {
|
83 | /// A pointer to an X server `xcb_connection_t`.
|
84 | ///
|
85 | /// It is strongly recommended to set this value, however it may be set to
|
86 | /// `None` to request the default display when using EGL.
|
87 | pub connection: Option<NonNull<c_void>>,
|
88 |
|
89 | /// An X11 screen to use with this display handle.
|
90 | ///
|
91 | /// Note, that X11 could have multiple screens, however
|
92 | /// graphics APIs could work only with one screen at the time,
|
93 | /// given that multiple screens usually reside on different GPUs.
|
94 | pub screen: c_int,
|
95 | }
|
96 |
|
97 | impl XcbDisplayHandle {
|
98 | /// Create a new handle to a connection and screen.
|
99 | ///
|
100 | ///
|
101 | /// # Example
|
102 | ///
|
103 | /// ```
|
104 | /// # use core::ffi::c_void;
|
105 | /// # use core::ptr::NonNull;
|
106 | /// # use raw_window_handle::XcbDisplayHandle;
|
107 | /// #
|
108 | /// let connection: NonNull<c_void>;
|
109 | /// let screen;
|
110 | /// # connection = NonNull::from(&()).cast();
|
111 | /// # screen = 0;
|
112 | /// let handle = XcbDisplayHandle::new(Some(connection), screen);
|
113 | /// ```
|
114 | pub fn new(connection: Option<NonNull<c_void>>, screen: c_int) -> Self {
|
115 | Self { connection, screen }
|
116 | }
|
117 | }
|
118 |
|
119 | /// Raw window handle for Xcb.
|
120 | #[non_exhaustive ]
|
121 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
122 | pub struct XcbWindowHandle {
|
123 | /// An X11 `xcb_window_t`.
|
124 | pub window: NonZeroU32, // Based on xproto.h
|
125 | /// An X11 `xcb_visualid_t`.
|
126 | pub visual_id: Option<NonZeroU32>,
|
127 | }
|
128 |
|
129 | impl XcbWindowHandle {
|
130 | /// Create a new handle to a window.
|
131 | ///
|
132 | ///
|
133 | /// # Example
|
134 | ///
|
135 | /// ```
|
136 | /// # use core::num::NonZeroU32;
|
137 | /// # use raw_window_handle::XcbWindowHandle;
|
138 | /// #
|
139 | /// let window: NonZeroU32;
|
140 | /// # window = NonZeroU32::new(1).unwrap();
|
141 | /// let mut handle = XcbWindowHandle::new(window);
|
142 | /// // Optionally set the visual ID.
|
143 | /// handle.visual_id = None;
|
144 | /// ```
|
145 | pub fn new(window: NonZeroU32) -> Self {
|
146 | Self {
|
147 | window,
|
148 | visual_id: None,
|
149 | }
|
150 | }
|
151 | }
|
152 |
|
153 | /// Raw display handle for Wayland.
|
154 | #[non_exhaustive ]
|
155 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
156 | pub struct WaylandDisplayHandle {
|
157 | /// A pointer to a `wl_display`.
|
158 | pub display: NonNull<c_void>,
|
159 | }
|
160 |
|
161 | impl WaylandDisplayHandle {
|
162 | /// Create a new display handle.
|
163 | ///
|
164 | ///
|
165 | /// # Example
|
166 | ///
|
167 | /// ```
|
168 | /// # use core::ffi::c_void;
|
169 | /// # use core::ptr::NonNull;
|
170 | /// # use raw_window_handle::WaylandDisplayHandle;
|
171 | /// #
|
172 | /// let display: NonNull<c_void>;
|
173 | /// # display = NonNull::from(&()).cast();
|
174 | /// let handle = WaylandDisplayHandle::new(display);
|
175 | /// ```
|
176 | pub fn new(display: NonNull<c_void>) -> Self {
|
177 | Self { display }
|
178 | }
|
179 | }
|
180 |
|
181 | /// Raw window handle for Wayland.
|
182 | #[non_exhaustive ]
|
183 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
184 | pub struct WaylandWindowHandle {
|
185 | /// A pointer to a `wl_surface`.
|
186 | pub surface: NonNull<c_void>,
|
187 | }
|
188 |
|
189 | impl WaylandWindowHandle {
|
190 | /// Create a new handle to a surface.
|
191 | ///
|
192 | ///
|
193 | /// # Example
|
194 | ///
|
195 | /// ```
|
196 | /// # use core::ffi::c_void;
|
197 | /// # use core::ptr::NonNull;
|
198 | /// # use raw_window_handle::WaylandWindowHandle;
|
199 | /// #
|
200 | /// let surface: NonNull<c_void>;
|
201 | /// # surface = NonNull::from(&()).cast();
|
202 | /// let handle = WaylandWindowHandle::new(surface);
|
203 | /// ```
|
204 | pub fn new(surface: NonNull<c_void>) -> Self {
|
205 | Self { surface }
|
206 | }
|
207 | }
|
208 |
|
209 | /// Raw display handle for the Linux Kernel Mode Set/Direct Rendering Manager.
|
210 | #[non_exhaustive ]
|
211 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
212 | pub struct DrmDisplayHandle {
|
213 | /// The drm file descriptor.
|
214 | // TODO: Use `std::os::fd::RawFd`?
|
215 | pub fd: i32,
|
216 | }
|
217 |
|
218 | impl DrmDisplayHandle {
|
219 | /// Create a new handle to a file descriptor.
|
220 | ///
|
221 | ///
|
222 | /// # Example
|
223 | ///
|
224 | /// ```
|
225 | /// # use raw_window_handle::DrmDisplayHandle;
|
226 | /// #
|
227 | /// let fd: i32;
|
228 | /// # fd = 0;
|
229 | /// let handle = DrmDisplayHandle::new(fd);
|
230 | /// ```
|
231 | pub fn new(fd: i32) -> Self {
|
232 | Self { fd }
|
233 | }
|
234 | }
|
235 |
|
236 | /// Raw window handle for the Linux Kernel Mode Set/Direct Rendering Manager.
|
237 | #[non_exhaustive ]
|
238 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
239 | pub struct DrmWindowHandle {
|
240 | /// The primary drm plane handle.
|
241 | pub plane: u32,
|
242 | }
|
243 |
|
244 | impl DrmWindowHandle {
|
245 | /// Create a new handle to a plane.
|
246 | ///
|
247 | ///
|
248 | /// # Example
|
249 | ///
|
250 | /// ```
|
251 | /// # use raw_window_handle::DrmWindowHandle;
|
252 | /// #
|
253 | /// let plane: u32;
|
254 | /// # plane = 0;
|
255 | /// let handle = DrmWindowHandle::new(plane);
|
256 | /// ```
|
257 | pub fn new(plane: u32) -> Self {
|
258 | Self { plane }
|
259 | }
|
260 | }
|
261 |
|
262 | /// Raw display handle for the Linux Generic Buffer Manager.
|
263 | #[non_exhaustive ]
|
264 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
265 | pub struct GbmDisplayHandle {
|
266 | /// The gbm device.
|
267 | pub gbm_device: NonNull<c_void>,
|
268 | }
|
269 |
|
270 | impl GbmDisplayHandle {
|
271 | /// Create a new handle to a device.
|
272 | ///
|
273 | ///
|
274 | /// # Example
|
275 | ///
|
276 | /// ```
|
277 | /// # use core::ffi::c_void;
|
278 | /// # use core::ptr::NonNull;
|
279 | /// # use raw_window_handle::GbmDisplayHandle;
|
280 | /// #
|
281 | /// let ptr: NonNull<c_void>;
|
282 | /// # ptr = NonNull::from(&()).cast();
|
283 | /// let handle = GbmDisplayHandle::new(ptr);
|
284 | /// ```
|
285 | pub fn new(gbm_device: NonNull<c_void>) -> Self {
|
286 | Self { gbm_device }
|
287 | }
|
288 | }
|
289 |
|
290 | /// Raw window handle for the Linux Generic Buffer Manager.
|
291 | #[non_exhaustive ]
|
292 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
293 | pub struct GbmWindowHandle {
|
294 | /// The gbm surface.
|
295 | pub gbm_surface: NonNull<c_void>,
|
296 | }
|
297 |
|
298 | impl GbmWindowHandle {
|
299 | /// Create a new handle to a surface.
|
300 | ///
|
301 | ///
|
302 | /// # Example
|
303 | ///
|
304 | /// ```
|
305 | /// # use core::ffi::c_void;
|
306 | /// # use core::ptr::NonNull;
|
307 | /// # use raw_window_handle::GbmWindowHandle;
|
308 | /// #
|
309 | /// let ptr: NonNull<c_void>;
|
310 | /// # ptr = NonNull::from(&()).cast();
|
311 | /// let handle = GbmWindowHandle::new(ptr);
|
312 | /// ```
|
313 | pub fn new(gbm_surface: NonNull<c_void>) -> Self {
|
314 | Self { gbm_surface }
|
315 | }
|
316 | }
|
317 | |