raw_window_handle_ffi/handles/
orbital.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::OrbitalWindowHandle`].
6///         Can be converted to and from the referenced type.
7#[repr(C)]
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub struct OrbitalWindowHandle {
10    /// A pointer to an orbclient window.
11    // TODO(madsmtm): I think this is a file descriptor, so perhaps it should
12    // actually use `std::os::fd::RawFd`, or some sort of integer instead?
13    pub window: NonNull<c_void>,
14}
15
16unsafe impl Send for OrbitalWindowHandle {}
17unsafe impl Sync for OrbitalWindowHandle {}
18
19impl From<raw_window_handle::OrbitalWindowHandle> for OrbitalWindowHandle {
20    fn from(value: raw_window_handle::OrbitalWindowHandle) -> Self {
21        Self {
22            window: value.window,
23        }
24    }
25}
26
27impl OrbitalWindowHandle {
28    /// Converts FFI type back to the original [`raw_window_handle::AppKitWindowHandle`].
29    ///
30    /// # Safety
31    /// Original type [`raw_window_handle::AppKitWindowHandle`] is marked as `non_exaustive`,
32    /// and therefore it is impossible to convert to it completely safely.
33    pub unsafe fn into(self) -> raw_window_handle::OrbitalWindowHandle {
34        raw_window_handle::OrbitalWindowHandle::new(self.window)
35    }
36}
37
38impl From<OrbitalWindowHandle> for RawWindowHandle {
39    fn from(val: OrbitalWindowHandle) -> RawWindowHandle {
40        RawWindowHandle {
41            kind: crate::RawWindowHandleKind::OrbitalWindowHandle,
42            data: RawWindowHandleData { orbital: val },
43        }
44    }
45}