raw_window_handle_ffi/handles/
app_kit.rs

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