diff options
Diffstat (limited to 'third_party/rust/raw-window-handle/src/unix.rs')
-rw-r--r-- | third_party/rust/raw-window-handle/src/unix.rs | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/third_party/rust/raw-window-handle/src/unix.rs b/third_party/rust/raw-window-handle/src/unix.rs new file mode 100644 index 0000000000..9035fc2563 --- /dev/null +++ b/third_party/rust/raw-window-handle/src/unix.rs @@ -0,0 +1,252 @@ +use core::ffi::c_void; +use core::ptr; + +use cty::{c_int, c_ulong}; + +/// Raw display handle for Xlib. +/// +/// ## Construction +/// ``` +/// # use raw_window_handle::XlibDisplayHandle; +/// let display_handle = XlibDisplayHandle::empty(); +/// /* set fields */ +/// ``` +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct XlibDisplayHandle { + /// A pointer to an Xlib `Display`. + pub display: *mut c_void, + + /// 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, +} + +/// Raw window handle for Xlib. +/// +/// ## Construction +/// ``` +/// # use raw_window_handle::XlibWindowHandle; +/// let window_handle = XlibWindowHandle::empty(); +/// /* set fields */ +/// ``` +#[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, +} + +/// Raw display handle for Xcb. +/// +/// ## Construction +/// ``` +/// # use raw_window_handle::XcbDisplayHandle; +/// let display_handle = XcbDisplayHandle::empty(); +/// /* set fields */ +/// ``` +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct XcbDisplayHandle { + /// A pointer to an X server `xcb_connection_t`. + pub connection: *mut c_void, + + /// 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, +} + +/// Raw window handle for Xcb. +/// +/// ## Construction +/// ``` +/// # use raw_window_handle::XcbWindowHandle; +/// let window_handle = XcbWindowHandle::empty(); +/// /* set fields */ +/// ``` +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct XcbWindowHandle { + /// An X11 `xcb_window_t`. + pub window: u32, // Based on xproto.h + /// An X11 `xcb_visualid_t`, or 0 if unknown. + pub visual_id: u32, +} + +/// Raw display handle for Wayland. +/// +/// ## Construction +/// ``` +/// # use raw_window_handle::WaylandDisplayHandle; +/// let display_handle = WaylandDisplayHandle::empty(); +/// /* set fields */ +/// ``` +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct WaylandDisplayHandle { + /// A pointer to a `wl_display`. + pub display: *mut c_void, +} + +/// Raw window handle for Wayland. +/// +/// ## Construction +/// ``` +/// # use raw_window_handle::WaylandWindowHandle; +/// let window_handle = WaylandWindowHandle::empty(); +/// /* set fields */ +/// ``` +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct WaylandWindowHandle { + /// A pointer to a `wl_surface`. + pub surface: *mut c_void, +} + +/// Raw display handle for the Linux Kernel Mode Set/Direct Rendering Manager. +/// +/// ## Construction +/// ``` +/// # use raw_window_handle::DrmDisplayHandle; +/// let display_handle = DrmDisplayHandle::empty(); +/// /* set fields */ +/// ``` +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct DrmDisplayHandle { + /// The drm file descriptor. + pub fd: i32, +} + +/// Raw window handle for the Linux Kernel Mode Set/Direct Rendering Manager. +/// +/// ## Construction +/// ``` +/// # use raw_window_handle::DrmWindowHandle; +/// let handle = DrmWindowHandle::empty(); +/// /* set fields */ +/// ``` +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct DrmWindowHandle { + /// The primary drm plane handle. + pub plane: u32, +} + +/// Raw display handle for the Linux Generic Buffer Manager. +/// +/// ## Construction +/// ``` +/// # use raw_window_handle::GbmDisplayHandle; +/// let display_handle = GbmDisplayHandle::empty(); +/// /* set fields */ +/// ``` +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct GbmDisplayHandle { + /// The gbm device. + pub gbm_device: *mut c_void, +} + +/// Raw window handle for the Linux Generic Buffer Manager. +/// +/// ## Construction +/// ``` +/// # use raw_window_handle::GbmWindowHandle; +/// let handle = GbmWindowHandle::empty(); +/// /* set fields */ +/// ``` +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct GbmWindowHandle { + /// The gbm surface. + pub gbm_surface: *mut c_void, +} + +impl XlibDisplayHandle { + pub fn empty() -> Self { + Self { + display: ptr::null_mut(), + screen: 0, + } + } +} + +impl XlibWindowHandle { + pub fn empty() -> Self { + Self { + window: 0, + visual_id: 0, + } + } +} + +impl XcbDisplayHandle { + pub fn empty() -> Self { + Self { + connection: ptr::null_mut(), + screen: 0, + } + } +} + +impl XcbWindowHandle { + pub fn empty() -> Self { + Self { + window: 0, + visual_id: 0, + } + } +} + +impl WaylandDisplayHandle { + pub fn empty() -> Self { + Self { + display: ptr::null_mut(), + } + } +} + +impl WaylandWindowHandle { + pub fn empty() -> Self { + Self { + surface: ptr::null_mut(), + } + } +} + +impl DrmDisplayHandle { + pub fn empty() -> Self { + Self { fd: 0 } + } +} + +impl DrmWindowHandle { + pub fn empty() -> Self { + Self { plane: 0 } + } +} + +impl GbmDisplayHandle { + pub fn empty() -> Self { + Self { + gbm_device: ptr::null_mut(), + } + } +} + +impl GbmWindowHandle { + pub fn empty() -> Self { + Self { + gbm_surface: ptr::null_mut(), + } + } +} |