raw_window_handle_ffi/handles/
wayland.rs

1use crate::{RawWindowHandle, RawWindowHandleData};
2use std::{ffi::c_void, ptr::NonNull};
3
4/// raw_window_handle_ffi:
5///         This type is ABI-stable and FFI-compatible analogue for [`raw_window_handle::WaylandWindowHandle`].
6///         Can be converted to and from the referenced type.
7#[repr(C)]
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub struct WaylandWindowHandle {
10    /// A pointer to a `wl_surface`.
11    pub surface: NonNull<c_void>,
12}
13
14unsafe impl Send for WaylandWindowHandle {}
15unsafe impl Sync for WaylandWindowHandle {}
16
17impl From<raw_window_handle::WaylandWindowHandle> for WaylandWindowHandle {
18    fn from(value: raw_window_handle::WaylandWindowHandle) -> Self {
19        Self {
20            surface: value.surface,
21        }
22    }
23}
24
25impl WaylandWindowHandle {
26    /// Converts FFI type back to the original [`raw_window_handle::AppKitWindowHandle`].
27    ///
28    /// # Safety
29    /// Original type [`raw_window_handle::AppKitWindowHandle`] is marked as `non_exaustive`,
30    /// and therefore it is impossible to convert to it completely safely.
31    pub unsafe fn into(self) -> raw_window_handle::WaylandWindowHandle {
32        raw_window_handle::WaylandWindowHandle::new(self.surface)
33    }
34}
35
36impl From<WaylandWindowHandle> for RawWindowHandle {
37    fn from(val: WaylandWindowHandle) -> RawWindowHandle {
38        RawWindowHandle {
39            kind: crate::RawWindowHandleKind::WaylandWindowHandle,
40            data: RawWindowHandleData { wayland: val },
41        }
42    }
43}