| 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 | |