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