raw_window_handle_extensions/
lib.rs

1use std::ffi::c_void;
2
3use raw_window_handle::{RawDisplayHandle, RawWindowHandle};
4
5use crate::error::RawError;
6
7mod android;
8mod appkit;
9mod error;
10mod haiku;
11mod redox;
12mod uikit;
13mod unix;
14mod web;
15mod windows;
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
18#[repr(u8)]
19pub enum RawWindowHandleType {
20    Unknown,
21    UiKit,
22    AppKit,
23    Orbital,
24    Xlib,
25    Xcb,
26    Wayland,
27    Drm,
28    Gbm,
29    Win32,
30    WinRt,
31    Web,
32    AndroidNdk,
33    Haiku,
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
37#[repr(u8)]
38pub enum RawDisplayHandleType {
39    Unknown,
40    UiKit,
41    AppKit,
42    Orbital,
43    Xlib,
44    Xcb,
45    Wayland,
46    Drm,
47    Gbm,
48    Windows,
49    Web,
50    Android,
51    Haiku,
52}
53
54#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
55#[repr(C)]
56pub struct VeryRawWindowHandle {
57    pub handle_type: RawWindowHandleType,
58    pub ptr_1: *mut c_void,
59    pub ptr_2: *mut c_void,
60    pub ptr_3: *mut c_void,
61    pub id_1: u64,
62    pub id_2: u64,
63}
64
65impl VeryRawWindowHandle {
66    pub fn unknown() -> Self {
67        Self {
68            handle_type: RawWindowHandleType::Unknown,
69            ptr_1: std::ptr::null_mut(),
70            ptr_2: std::ptr::null_mut(),
71            ptr_3: std::ptr::null_mut(),
72            id_1: Default::default(),
73            id_2: Default::default(),
74        }
75    }
76
77    pub unsafe fn from_ptr<'a>(ptr: *mut Self) -> Result<&'a Self, RawError> {
78        ptr.as_ref().ok_or_else(|| RawError::NullPointer)
79    }
80}
81
82impl From<VeryRawWindowHandle> for *mut VeryRawWindowHandle {
83    fn from(value: VeryRawWindowHandle) -> Self {
84        Box::into_raw(Box::new(value))
85    }
86}
87
88#[no_mangle]
89pub extern "C" fn very_raw_window_handle_drop(pointer: *mut VeryRawWindowHandle) {
90    if pointer.is_null() {
91        return;
92    }
93    unsafe { let _ = Box::from_raw(pointer); };
94}
95
96#[derive(Clone, Debug)]
97#[repr(C)]
98pub struct VeryRawDisplayHandle {
99    pub handle_type: RawDisplayHandleType,
100    pub ptr_1: *mut c_void,
101    pub id_1: u64,
102}
103
104impl VeryRawDisplayHandle {
105    pub fn unknown() -> Self {
106        Self {
107            handle_type: RawDisplayHandleType::Unknown,
108            ptr_1: std::ptr::null_mut(),
109            id_1: Default::default(),
110        }
111    }
112
113    pub unsafe fn from_ptr<'a>(ptr: *mut Self) -> Result<&'a Self, RawError> {
114        ptr.as_ref().ok_or_else(|| RawError::NullPointer)
115    }
116}
117
118impl From<VeryRawDisplayHandle> for *mut VeryRawDisplayHandle {
119    fn from(value: VeryRawDisplayHandle) -> Self {
120        Box::into_raw(Box::new(value))
121    }
122}
123
124#[no_mangle]
125pub extern "C" fn very_raw_display_handle_drop(pointer: *mut VeryRawDisplayHandle) {
126    if pointer.is_null() {
127        return;
128    }
129    unsafe { let _ = Box::from_raw(pointer); };
130}
131
132impl From<RawWindowHandle> for VeryRawWindowHandle {
133    fn from(value: RawWindowHandle) -> Self {
134        match value {
135            RawWindowHandle::UiKit(handle) => handle.into(),
136            RawWindowHandle::AppKit(handle) => handle.into(),
137            RawWindowHandle::Orbital(handle) => handle.into(),
138            RawWindowHandle::Xlib(handle) => handle.into(),
139            RawWindowHandle::Xcb(handle) => handle.into(),
140            RawWindowHandle::Wayland(handle) => handle.into(),
141            RawWindowHandle::Drm(handle) => handle.into(),
142            RawWindowHandle::Gbm(handle) => handle.into(),
143            RawWindowHandle::Win32(handle) => handle.into(),
144            RawWindowHandle::WinRt(handle) => handle.into(),
145            RawWindowHandle::Web(handle) => handle.into(),
146            RawWindowHandle::AndroidNdk(handle) => handle.into(),
147            RawWindowHandle::Haiku(handle) => handle.into(),
148            _ => Self::unknown(),
149        }
150    }
151}
152
153impl TryFrom<VeryRawWindowHandle> for RawWindowHandle {
154    type Error = RawError;
155
156    fn try_from(value: VeryRawWindowHandle) -> Result<Self, Self::Error> {
157        match value.handle_type {
158            RawWindowHandleType::Unknown => {
159                Err(RawError::UnsupportedWindowHandle(value.handle_type))
160            }
161            RawWindowHandleType::UiKit => Ok(RawWindowHandle::UiKit(value.into())),
162            RawWindowHandleType::AppKit => Ok(RawWindowHandle::AppKit(value.into())),
163            RawWindowHandleType::Orbital => Ok(RawWindowHandle::Orbital(value.into())),
164            RawWindowHandleType::Xlib => Ok(RawWindowHandle::Xlib(value.into())),
165            RawWindowHandleType::Xcb => Ok(RawWindowHandle::Xcb(value.into())),
166            RawWindowHandleType::Wayland => Ok(RawWindowHandle::Wayland(value.into())),
167            RawWindowHandleType::Drm => Ok(RawWindowHandle::Drm(value.into())),
168            RawWindowHandleType::Gbm => Ok(RawWindowHandle::Gbm(value.into())),
169            RawWindowHandleType::Win32 => Ok(RawWindowHandle::Win32(value.into())),
170            RawWindowHandleType::WinRt => Ok(RawWindowHandle::WinRt(value.into())),
171            RawWindowHandleType::Web => Ok(RawWindowHandle::Web(value.into())),
172            RawWindowHandleType::AndroidNdk => Ok(RawWindowHandle::AndroidNdk(value.into())),
173            RawWindowHandleType::Haiku => Ok(RawWindowHandle::Haiku(value.into())),
174        }
175    }
176}
177
178impl From<RawDisplayHandle> for VeryRawDisplayHandle {
179    fn from(value: RawDisplayHandle) -> Self {
180        match value {
181            RawDisplayHandle::UiKit(handle) => handle.into(),
182            RawDisplayHandle::AppKit(handle) => handle.into(),
183            RawDisplayHandle::Orbital(handle) => handle.into(),
184            RawDisplayHandle::Xlib(handle) => handle.into(),
185            RawDisplayHandle::Xcb(handle) => handle.into(),
186            RawDisplayHandle::Wayland(handle) => handle.into(),
187            RawDisplayHandle::Drm(handle) => handle.into(),
188            RawDisplayHandle::Gbm(handle) => handle.into(),
189            RawDisplayHandle::Windows(handle) => handle.into(),
190            RawDisplayHandle::Web(handle) => handle.into(),
191            RawDisplayHandle::Android(handle) => handle.into(),
192            RawDisplayHandle::Haiku(handle) => handle.into(),
193            _ => Self::unknown(),
194        }
195    }
196}
197
198impl TryFrom<VeryRawDisplayHandle> for RawDisplayHandle {
199    type Error = RawError;
200
201    fn try_from(value: VeryRawDisplayHandle) -> Result<Self, Self::Error> {
202        match value.handle_type {
203            RawDisplayHandleType::Unknown => {
204                Err(RawError::UnsupportedDisplayHandle(value.handle_type))
205            }
206            RawDisplayHandleType::UiKit => Ok(RawDisplayHandle::UiKit(value.into())),
207            RawDisplayHandleType::AppKit => Ok(RawDisplayHandle::AppKit(value.into())),
208            RawDisplayHandleType::Orbital => Ok(RawDisplayHandle::Orbital(value.into())),
209            RawDisplayHandleType::Xlib => Ok(RawDisplayHandle::Xlib(value.into())),
210            RawDisplayHandleType::Xcb => Ok(RawDisplayHandle::Xcb(value.into())),
211            RawDisplayHandleType::Wayland => Ok(RawDisplayHandle::Wayland(value.into())),
212            RawDisplayHandleType::Drm => Ok(RawDisplayHandle::Drm(value.into())),
213            RawDisplayHandleType::Gbm => Ok(RawDisplayHandle::Gbm(value.into())),
214            RawDisplayHandleType::Windows => Ok(RawDisplayHandle::Windows(value.into())),
215            RawDisplayHandleType::Web => Ok(RawDisplayHandle::Web(value.into())),
216            RawDisplayHandleType::Android => Ok(RawDisplayHandle::Android(value.into())),
217            RawDisplayHandleType::Haiku => Ok(RawDisplayHandle::Haiku(value.into())),
218        }
219    }
220}