raw_window_handle_extensions/
lib.rs1use 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}