use core::ffi::{c_int, c_ulong, c_void}; use core::num::NonZeroU32; use core::ptr::NonNull; /// Raw display handle for Xlib. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct XlibDisplayHandle { /// A pointer to an Xlib `Display`. /// /// It is strongly recommended to set this value, however it may be set to /// `None` to request the default display when using EGL. pub display: Option>, /// An X11 screen to use with this display handle. /// /// Note, that X11 could have multiple screens, however /// graphics APIs could work only with one screen at the time, /// given that multiple screens usually reside on different GPUs. pub screen: c_int, } impl XlibDisplayHandle { /// Create a new handle to a display. /// /// /// # Example /// /// ``` /// # use core::ffi::c_void; /// # use core::ptr::NonNull; /// # use raw_window_handle::XlibDisplayHandle; /// # /// let display: NonNull; /// let screen; /// # display = NonNull::from(&()).cast(); /// # screen = 0; /// let handle = XlibDisplayHandle::new(Some(display), screen); /// ``` pub fn new(display: Option>, screen: c_int) -> Self { Self { display, screen } } } /// Raw window handle for Xlib. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct XlibWindowHandle { /// An Xlib `Window`. pub window: c_ulong, /// An Xlib visual ID, or 0 if unknown. pub visual_id: c_ulong, } impl XlibWindowHandle { /// Create a new handle to a window. /// /// /// # Example /// /// ``` /// # use core::ffi::c_ulong; /// # use raw_window_handle::XlibWindowHandle; /// # /// let window: c_ulong; /// # window = 0; /// let mut handle = XlibWindowHandle::new(window); /// // Optionally set the visual ID. /// handle.visual_id = 0; /// ``` pub fn new(window: c_ulong) -> Self { Self { window, visual_id: 0, } } } /// Raw display handle for Xcb. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct XcbDisplayHandle { /// A pointer to an X server `xcb_connection_t`. /// /// It is strongly recommended to set this value, however it may be set to /// `None` to request the default display when using EGL. pub connection: Option>, /// An X11 screen to use with this display handle. /// /// Note, that X11 could have multiple screens, however /// graphics APIs could work only with one screen at the time, /// given that multiple screens usually reside on different GPUs. pub screen: c_int, } impl XcbDisplayHandle { /// Create a new handle to a connection and screen. /// /// /// # Example /// /// ``` /// # use core::ffi::c_void; /// # use core::ptr::NonNull; /// # use raw_window_handle::XcbDisplayHandle; /// # /// let connection: NonNull; /// let screen; /// # connection = NonNull::from(&()).cast(); /// # screen = 0; /// let handle = XcbDisplayHandle::new(Some(connection), screen); /// ``` pub fn new(connection: Option>, screen: c_int) -> Self { Self { connection, screen } } } /// Raw window handle for Xcb. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct XcbWindowHandle { /// An X11 `xcb_window_t`. pub window: NonZeroU32, // Based on xproto.h /// An X11 `xcb_visualid_t`. pub visual_id: Option, } impl XcbWindowHandle { /// Create a new handle to a window. /// /// /// # Example /// /// ``` /// # use core::num::NonZeroU32; /// # use raw_window_handle::XcbWindowHandle; /// # /// let window: NonZeroU32; /// # window = NonZeroU32::new(1).unwrap(); /// let mut handle = XcbWindowHandle::new(window); /// // Optionally set the visual ID. /// handle.visual_id = None; /// ``` pub fn new(window: NonZeroU32) -> Self { Self { window, visual_id: None, } } } /// Raw display handle for Wayland. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct WaylandDisplayHandle { /// A pointer to a `wl_display`. pub display: NonNull, } impl WaylandDisplayHandle { /// Create a new display handle. /// /// /// # Example /// /// ``` /// # use core::ffi::c_void; /// # use core::ptr::NonNull; /// # use raw_window_handle::WaylandDisplayHandle; /// # /// let display: NonNull; /// # display = NonNull::from(&()).cast(); /// let handle = WaylandDisplayHandle::new(display); /// ``` pub fn new(display: NonNull) -> Self { Self { display } } } /// Raw window handle for Wayland. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct WaylandWindowHandle { /// A pointer to a `wl_surface`. pub surface: NonNull, } impl WaylandWindowHandle { /// Create a new handle to a surface. /// /// /// # Example /// /// ``` /// # use core::ffi::c_void; /// # use core::ptr::NonNull; /// # use raw_window_handle::WaylandWindowHandle; /// # /// let surface: NonNull; /// # surface = NonNull::from(&()).cast(); /// let handle = WaylandWindowHandle::new(surface); /// ``` pub fn new(surface: NonNull) -> Self { Self { surface } } } /// Raw display handle for the Linux Kernel Mode Set/Direct Rendering Manager. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct DrmDisplayHandle { /// The drm file descriptor. // TODO: Use `std::os::fd::RawFd`? pub fd: i32, } impl DrmDisplayHandle { /// Create a new handle to a file descriptor. /// /// /// # Example /// /// ``` /// # use raw_window_handle::DrmDisplayHandle; /// # /// let fd: i32; /// # fd = 0; /// let handle = DrmDisplayHandle::new(fd); /// ``` pub fn new(fd: i32) -> Self { Self { fd } } } /// Raw window handle for the Linux Kernel Mode Set/Direct Rendering Manager. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct DrmWindowHandle { /// The primary drm plane handle. pub plane: u32, } impl DrmWindowHandle { /// Create a new handle to a plane. /// /// /// # Example /// /// ``` /// # use raw_window_handle::DrmWindowHandle; /// # /// let plane: u32; /// # plane = 0; /// let handle = DrmWindowHandle::new(plane); /// ``` pub fn new(plane: u32) -> Self { Self { plane } } } /// Raw display handle for the Linux Generic Buffer Manager. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct GbmDisplayHandle { /// The gbm device. pub gbm_device: NonNull, } impl GbmDisplayHandle { /// Create a new handle to a device. /// /// /// # Example /// /// ``` /// # use core::ffi::c_void; /// # use core::ptr::NonNull; /// # use raw_window_handle::GbmDisplayHandle; /// # /// let ptr: NonNull; /// # ptr = NonNull::from(&()).cast(); /// let handle = GbmDisplayHandle::new(ptr); /// ``` pub fn new(gbm_device: NonNull) -> Self { Self { gbm_device } } } /// Raw window handle for the Linux Generic Buffer Manager. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct GbmWindowHandle { /// The gbm surface. pub gbm_surface: NonNull, } impl GbmWindowHandle { /// Create a new handle to a surface. /// /// /// # Example /// /// ``` /// # use core::ffi::c_void; /// # use core::ptr::NonNull; /// # use raw_window_handle::GbmWindowHandle; /// # /// let ptr: NonNull; /// # ptr = NonNull::from(&()).cast(); /// let handle = GbmWindowHandle::new(ptr); /// ``` pub fn new(gbm_surface: NonNull) -> Self { Self { gbm_surface } } }