raw_window_handle_ffi/handles/
ui_kit.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::UiKitWindowHandle`].
6///         Can be converted to and from the referenced type.
7#[repr(C)]
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub struct UiKitWindowHandle {
10    /// A pointer to an `UIView` object.
11    pub ui_view: NonNull<c_void>,
12    /// A pointer to an `UIViewController` object, if the view has one.
13    pub ui_view_controller: Option<NonNull<c_void>>,
14}
15
16unsafe impl Send for UiKitWindowHandle {}
17unsafe impl Sync for UiKitWindowHandle {}
18
19impl From<raw_window_handle::UiKitWindowHandle> for UiKitWindowHandle {
20    fn from(value: raw_window_handle::UiKitWindowHandle) -> Self {
21        Self {
22            ui_view: value.ui_view,
23            ui_view_controller: value.ui_view_controller,
24        }
25    }
26}
27
28impl UiKitWindowHandle {
29    /// Converts FFI type back to the original [`raw_window_handle::AppKitWindowHandle`].
30    ///
31    /// # Safety
32    /// Original type [`raw_window_handle::AppKitWindowHandle`] is marked as `non_exaustive`,
33    /// and therefore it is impossible to convert to it completely safely.
34    pub unsafe fn into(self) -> raw_window_handle::UiKitWindowHandle {
35        let mut result = raw_window_handle::UiKitWindowHandle::new(self.ui_view);
36        result.ui_view_controller = self.ui_view_controller;
37        result
38    }
39}
40
41impl From<UiKitWindowHandle> for RawWindowHandle {
42    fn from(val: UiKitWindowHandle) -> RawWindowHandle {
43        RawWindowHandle {
44            kind: crate::RawWindowHandleKind::UiKitWindowHandle,
45            data: RawWindowHandleData { ui_kit: val },
46        }
47    }
48}