raw_window_handle_ffi/handles/
win_rt.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::WinRtWindowHandle`].
6///         Can be converted to and from the referenced type.
7#[repr(C)]
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub struct WinRtWindowHandle {
10    /// A WinRT `CoreWindow` handle.
11    pub core_window: NonNull<c_void>,
12}
13
14unsafe impl Send for WinRtWindowHandle {}
15unsafe impl Sync for WinRtWindowHandle {}
16
17impl From<raw_window_handle::WinRtWindowHandle> for WinRtWindowHandle {
18    fn from(value: raw_window_handle::WinRtWindowHandle) -> Self {
19        Self {
20            core_window: value.core_window,
21        }
22    }
23}
24
25impl WinRtWindowHandle {
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::WinRtWindowHandle {
32        raw_window_handle::WinRtWindowHandle::new(self.core_window)
33    }
34}
35
36impl From<WinRtWindowHandle> for RawWindowHandle {
37    fn from(val: WinRtWindowHandle) -> RawWindowHandle {
38        RawWindowHandle {
39            kind: crate::RawWindowHandleKind::WinRtWindowHandle,
40            data: RawWindowHandleData { win_rt: val },
41        }
42    }
43}