raw_window_handle_extensions/
unix.rs

1use raw_window_handle::{
2    DrmDisplayHandle, DrmWindowHandle, GbmDisplayHandle, GbmWindowHandle, WaylandDisplayHandle,
3    WaylandWindowHandle, XcbDisplayHandle, XcbWindowHandle, XlibDisplayHandle, XlibWindowHandle,
4};
5use std::ffi::{c_int, c_ulong};
6use std::num::NonZeroU32;
7use std::ptr::NonNull;
8
9use crate::{RawDisplayHandleType, RawWindowHandleType, VeryRawDisplayHandle, VeryRawWindowHandle};
10
11impl From<XlibWindowHandle> for VeryRawWindowHandle {
12    fn from(value: XlibWindowHandle) -> Self {
13        Self {
14            handle_type: RawWindowHandleType::Xlib,
15            ptr_1: std::ptr::null_mut(),
16            ptr_2: std::ptr::null_mut(),
17            ptr_3: std::ptr::null_mut(),
18            id_1: value.window as u64,
19            id_2: value.visual_id as u64,
20        }
21    }
22}
23
24impl From<VeryRawWindowHandle> for XlibWindowHandle {
25    fn from(value: VeryRawWindowHandle) -> Self {
26        assert_eq!(value.handle_type, RawWindowHandleType::Xlib);
27        let mut window_handle = Self::new(value.id_1 as c_ulong);
28        window_handle.visual_id = value.id_2 as c_ulong;
29        window_handle
30    }
31}
32
33impl From<XlibDisplayHandle> for VeryRawDisplayHandle {
34    fn from(value: XlibDisplayHandle) -> Self {
35        Self {
36            handle_type: RawDisplayHandleType::Xlib,
37            ptr_1: value
38                .display
39                .map(|ptr| ptr.as_ptr())
40                .unwrap_or(std::ptr::null_mut()),
41            id_1: value.screen as u64,
42        }
43    }
44}
45
46impl From<VeryRawDisplayHandle> for XlibDisplayHandle {
47    fn from(value: VeryRawDisplayHandle) -> Self {
48        assert_eq!(value.handle_type, RawDisplayHandleType::Xlib);
49
50        let window_handle = Self::new(NonNull::new(value.ptr_1), value.id_1 as c_int);
51        window_handle
52    }
53}
54
55impl From<XcbWindowHandle> for VeryRawWindowHandle {
56    fn from(value: XcbWindowHandle) -> Self {
57        Self {
58            handle_type: RawWindowHandleType::Xcb,
59            ptr_1: std::ptr::null_mut(),
60            ptr_2: std::ptr::null_mut(),
61            ptr_3: std::ptr::null_mut(),
62            id_1: value.window.get() as u64,
63            id_2: value.visual_id.map(|id| id.get()).unwrap_or(0) as u64,
64        }
65    }
66}
67
68impl From<VeryRawWindowHandle> for XcbWindowHandle {
69    fn from(value: VeryRawWindowHandle) -> Self {
70        assert_eq!(value.handle_type, RawWindowHandleType::Xcb);
71        let mut window_handle = Self::new(NonZeroU32::new(value.id_1 as u32).unwrap());
72        window_handle.visual_id = NonZeroU32::new(value.id_2 as u32);
73        window_handle
74    }
75}
76
77impl From<XcbDisplayHandle> for VeryRawDisplayHandle {
78    fn from(value: XcbDisplayHandle) -> Self {
79        Self {
80            handle_type: RawDisplayHandleType::Xcb,
81            ptr_1: value
82                .connection
83                .map(|value| value.as_ptr())
84                .unwrap_or(std::ptr::null_mut()),
85            id_1: value.screen as u64,
86        }
87    }
88}
89
90impl From<VeryRawDisplayHandle> for XcbDisplayHandle {
91    fn from(value: VeryRawDisplayHandle) -> Self {
92        assert_eq!(value.handle_type, RawDisplayHandleType::Xcb);
93        let window_handle = Self::new(NonNull::new(value.ptr_1), value.id_1 as c_int);
94        window_handle
95    }
96}
97
98impl From<WaylandWindowHandle> for VeryRawWindowHandle {
99    fn from(value: WaylandWindowHandle) -> Self {
100        Self {
101            handle_type: RawWindowHandleType::Wayland,
102            ptr_1: value.surface.as_ptr(),
103            ptr_2: std::ptr::null_mut(),
104            ptr_3: std::ptr::null_mut(),
105            id_1: Default::default(),
106            id_2: Default::default(),
107        }
108    }
109}
110
111impl From<VeryRawWindowHandle> for WaylandWindowHandle {
112    fn from(value: VeryRawWindowHandle) -> Self {
113        assert_eq!(value.handle_type, RawWindowHandleType::Wayland);
114        let window_handle = Self::new(NonNull::new(value.ptr_1).unwrap());
115        window_handle
116    }
117}
118
119impl From<WaylandDisplayHandle> for VeryRawDisplayHandle {
120    fn from(value: WaylandDisplayHandle) -> Self {
121        Self {
122            handle_type: RawDisplayHandleType::Wayland,
123            ptr_1: value.display.as_ptr(),
124            id_1: Default::default(),
125        }
126    }
127}
128
129impl From<VeryRawDisplayHandle> for WaylandDisplayHandle {
130    fn from(value: VeryRawDisplayHandle) -> Self {
131        assert_eq!(value.handle_type, RawDisplayHandleType::Wayland);
132        let window_handle = Self::new(NonNull::new(value.ptr_1).unwrap());
133        window_handle
134    }
135}
136
137impl From<DrmWindowHandle> for VeryRawWindowHandle {
138    fn from(value: DrmWindowHandle) -> Self {
139        Self {
140            handle_type: RawWindowHandleType::Drm,
141            ptr_1: std::ptr::null_mut(),
142            ptr_2: std::ptr::null_mut(),
143            ptr_3: std::ptr::null_mut(),
144            id_1: value.plane as u64,
145            id_2: Default::default(),
146        }
147    }
148}
149
150impl From<VeryRawWindowHandle> for DrmWindowHandle {
151    fn from(value: VeryRawWindowHandle) -> Self {
152        assert_eq!(value.handle_type, RawWindowHandleType::Drm);
153        let window_handle = Self::new(value.id_1 as u32);
154        window_handle
155    }
156}
157
158impl From<DrmDisplayHandle> for VeryRawDisplayHandle {
159    fn from(value: DrmDisplayHandle) -> Self {
160        Self {
161            handle_type: RawDisplayHandleType::Drm,
162            ptr_1: std::ptr::null_mut(),
163            id_1: value.fd as u64,
164        }
165    }
166}
167
168impl From<VeryRawDisplayHandle> for DrmDisplayHandle {
169    fn from(value: VeryRawDisplayHandle) -> Self {
170        assert_eq!(value.handle_type, RawDisplayHandleType::Drm);
171        let window_handle = Self::new(value.id_1 as i32);
172        window_handle
173    }
174}
175
176impl From<GbmWindowHandle> for VeryRawWindowHandle {
177    fn from(value: GbmWindowHandle) -> Self {
178        Self {
179            handle_type: RawWindowHandleType::Gbm,
180            ptr_1: value.gbm_surface.as_ptr(),
181            ptr_2: std::ptr::null_mut(),
182            ptr_3: std::ptr::null_mut(),
183            id_1: Default::default(),
184            id_2: Default::default(),
185        }
186    }
187}
188
189impl From<VeryRawWindowHandle> for GbmWindowHandle {
190    fn from(value: VeryRawWindowHandle) -> Self {
191        assert_eq!(value.handle_type, RawWindowHandleType::Gbm);
192        let window_handle = Self::new(NonNull::new(value.ptr_1).unwrap());
193        window_handle
194    }
195}
196
197impl From<GbmDisplayHandle> for VeryRawDisplayHandle {
198    fn from(value: GbmDisplayHandle) -> Self {
199        Self {
200            handle_type: RawDisplayHandleType::Gbm,
201            ptr_1: value.gbm_device.as_ptr(),
202            id_1: Default::default(),
203        }
204    }
205}
206
207impl From<VeryRawDisplayHandle> for GbmDisplayHandle {
208    fn from(value: VeryRawDisplayHandle) -> Self {
209        assert_eq!(value.handle_type, RawDisplayHandleType::Gbm);
210        let window_handle = Self::new(NonNull::new(value.ptr_1).unwrap());
211        window_handle
212    }
213}