| 1 | #![no_std ] |
| 2 | #![cfg_attr (docsrs, feature(doc_cfg))] |
| 3 | #![allow (clippy::new_without_default)] |
| 4 | #![deny (unsafe_op_in_unsafe_fn)] |
| 5 | |
| 6 | //! Interoperability library for Rust Windowing applications. |
| 7 | //! |
| 8 | //! This library provides standard types for accessing a window's platform-specific raw window |
| 9 | //! handle and platforms display handle. This does not provide any utilities for creating and |
| 10 | //! managing windows; instead, it provides a common interface that window creation libraries (e.g. |
| 11 | //! Winit, SDL) can use to easily talk with graphics libraries (e.g. gfx-hal). |
| 12 | //! |
| 13 | //! ## Safety guarantees |
| 14 | //! |
| 15 | //! Please see the docs of [`HasWindowHandle`] and [`HasDisplayHandle`]. |
| 16 | //! |
| 17 | //! ## Platform handle initialization |
| 18 | //! |
| 19 | //! Each platform handle struct is purposefully non-exhaustive, so that additional fields may be |
| 20 | //! added without breaking backwards compatibility. Each struct provides an `empty` method that may |
| 21 | //! be used along with the struct update syntax to construct it. See each specific struct for |
| 22 | //! examples. |
| 23 | //! |
| 24 | //! ## Display Handles |
| 25 | //! |
| 26 | //! Some windowing systems use a separate display handle for some operations. The display usually |
| 27 | //! represents a connection to some display server, but it is not necessarily tied to a particular |
| 28 | //! window. See [`RawDisplayHandle`] for more details. |
| 29 | |
| 30 | #[cfg (feature = "alloc" )] |
| 31 | extern crate alloc; |
| 32 | |
| 33 | #[cfg (feature = "std" )] |
| 34 | extern crate std; |
| 35 | |
| 36 | mod android; |
| 37 | mod appkit; |
| 38 | mod borrowed; |
| 39 | mod haiku; |
| 40 | mod ohos; |
| 41 | mod redox; |
| 42 | mod uikit; |
| 43 | mod unix; |
| 44 | mod web; |
| 45 | mod windows; |
| 46 | |
| 47 | pub use android::{AndroidDisplayHandle, AndroidNdkWindowHandle}; |
| 48 | pub use appkit::{AppKitDisplayHandle, AppKitWindowHandle}; |
| 49 | pub use borrowed::{DisplayHandle, HasDisplayHandle, HasWindowHandle, WindowHandle}; |
| 50 | pub use haiku::{HaikuDisplayHandle, HaikuWindowHandle}; |
| 51 | pub use ohos::{OhosDisplayHandle, OhosNdkWindowHandle}; |
| 52 | pub use redox::{OrbitalDisplayHandle, OrbitalWindowHandle}; |
| 53 | pub use uikit::{UiKitDisplayHandle, UiKitWindowHandle}; |
| 54 | pub use unix::{ |
| 55 | DrmDisplayHandle, DrmWindowHandle, GbmDisplayHandle, GbmWindowHandle, WaylandDisplayHandle, |
| 56 | WaylandWindowHandle, XcbDisplayHandle, XcbWindowHandle, XlibDisplayHandle, XlibWindowHandle, |
| 57 | }; |
| 58 | pub use web::{ |
| 59 | WebCanvasWindowHandle, WebDisplayHandle, WebOffscreenCanvasWindowHandle, WebWindowHandle, |
| 60 | }; |
| 61 | pub use windows::{Win32WindowHandle, WinRtWindowHandle, WindowsDisplayHandle}; |
| 62 | |
| 63 | use core::fmt; |
| 64 | |
| 65 | /// Window that wraps around a raw window handle. |
| 66 | /// |
| 67 | /// # Safety |
| 68 | /// |
| 69 | /// Users can safely assume that pointers and non-zero fields are valid, and it is up to the |
| 70 | /// implementer of this trait to ensure that condition is upheld. |
| 71 | /// |
| 72 | /// Despite that qualification, implementers should still make a best-effort attempt to fill in all |
| 73 | /// available fields. If an implementation doesn't, and a downstream user needs the field, it should |
| 74 | /// try to derive the field from other fields the implementer *does* provide via whatever methods the |
| 75 | /// platform provides. |
| 76 | /// |
| 77 | /// The exact handles returned by `raw_window_handle` must remain consistent between multiple calls |
| 78 | /// to `raw_window_handle` as long as not indicated otherwise by platform specific events. |
| 79 | #[deprecated = "Use `HasWindowHandle` instead" ] |
| 80 | pub unsafe trait HasRawWindowHandle { |
| 81 | fn raw_window_handle(&self) -> Result<RawWindowHandle, HandleError>; |
| 82 | } |
| 83 | |
| 84 | #[allow (deprecated)] |
| 85 | unsafe impl<T: HasWindowHandle + ?Sized> HasRawWindowHandle for T { |
| 86 | fn raw_window_handle(&self) -> Result<RawWindowHandle, HandleError> { |
| 87 | self.window_handle().map(op:Into::into) |
| 88 | } |
| 89 | } |
| 90 | |
| 91 | /// A window handle for a particular windowing system. |
| 92 | /// |
| 93 | /// Each variant contains a struct with fields specific to that windowing system |
| 94 | /// (e.g. [`Win32WindowHandle`] will include a [HWND], [`WaylandWindowHandle`] uses [wl_surface], |
| 95 | /// etc.) |
| 96 | /// |
| 97 | /// [HWND]: https://learn.microsoft.com/en-us/windows/win32/winmsg/about-windows#window-handle |
| 98 | /// [wl_surface]: https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_surface |
| 99 | /// |
| 100 | /// # Variant Availability |
| 101 | /// |
| 102 | /// Note that all variants are present on all targets (none are disabled behind |
| 103 | /// `#[cfg]`s), but see the "Availability Hints" section on each variant for |
| 104 | /// some hints on where this variant might be expected. |
| 105 | /// |
| 106 | /// Note that these "Availability Hints" are not normative. That is to say, a |
| 107 | /// [`HasWindowHandle`] implementor is completely allowed to return something |
| 108 | /// unexpected. (For example, it's legal for someone to return a |
| 109 | /// [`RawWindowHandle::Xlib`] on macOS, it would just be weird, and probably |
| 110 | /// requires something like XQuartz be used). |
| 111 | #[non_exhaustive ] |
| 112 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)] |
| 113 | pub enum RawWindowHandle { |
| 114 | /// A raw window handle for UIKit (Apple's non-macOS windowing library). |
| 115 | /// |
| 116 | /// ## Availability Hints |
| 117 | /// This variant is likely to be used on iOS, tvOS, (in theory) watchOS, and |
| 118 | /// Mac Catalyst (`$arch-apple-ios-macabi` targets, which can notably use |
| 119 | /// UIKit *or* AppKit), as these are the targets that (currently) support |
| 120 | /// UIKit. |
| 121 | UiKit(UiKitWindowHandle), |
| 122 | /// A raw window handle for AppKit. |
| 123 | /// |
| 124 | /// ## Availability Hints |
| 125 | /// This variant is likely to be used on macOS, although Mac Catalyst |
| 126 | /// (`$arch-apple-ios-macabi` targets, which can notably use UIKit *or* |
| 127 | /// AppKit) can also use it despite being `target_os = "ios"`. |
| 128 | AppKit(AppKitWindowHandle), |
| 129 | /// A raw window handle for the Redox operating system. |
| 130 | /// |
| 131 | /// ## Availability Hints |
| 132 | /// This variant is used by the Orbital Windowing System in the Redox |
| 133 | /// operating system. |
| 134 | Orbital(OrbitalWindowHandle), |
| 135 | /// A raw window handle for the OpenHarmony OS NDK |
| 136 | /// |
| 137 | /// ## Availability Hints |
| 138 | /// This variant is used on OpenHarmony OS (`target_env = "ohos"`). |
| 139 | OhosNdk(OhosNdkWindowHandle), |
| 140 | /// A raw window handle for Xlib. |
| 141 | /// |
| 142 | /// ## Availability Hints |
| 143 | /// This variant is likely to show up anywhere someone manages to get X11 |
| 144 | /// working that Xlib can be built for, which is to say, most (but not all) |
| 145 | /// Unix systems. |
| 146 | Xlib(XlibWindowHandle), |
| 147 | /// A raw window handle for Xcb. |
| 148 | /// |
| 149 | /// ## Availability Hints |
| 150 | /// This variant is likely to show up anywhere someone manages to get X11 |
| 151 | /// working that XCB can be built for, which is to say, most (but not all) |
| 152 | /// Unix systems. |
| 153 | Xcb(XcbWindowHandle), |
| 154 | /// A raw window handle for Wayland. |
| 155 | /// |
| 156 | /// ## Availability Hints |
| 157 | /// This variant should be expected anywhere Wayland works, which is |
| 158 | /// currently some subset of unix systems. |
| 159 | Wayland(WaylandWindowHandle), |
| 160 | /// A raw window handle for the Linux Kernel Mode Set/Direct Rendering Manager |
| 161 | /// |
| 162 | /// ## Availability Hints |
| 163 | /// This variant is used on Linux when neither X nor Wayland are available |
| 164 | Drm(DrmWindowHandle), |
| 165 | /// A raw window handle for the Linux Generic Buffer Manager. |
| 166 | /// |
| 167 | /// ## Availability Hints |
| 168 | /// This variant is present regardless of windowing backend and likely to be used with |
| 169 | /// EGL_MESA_platform_gbm or EGL_KHR_platform_gbm. |
| 170 | Gbm(GbmWindowHandle), |
| 171 | /// A raw window handle for Win32. |
| 172 | /// |
| 173 | /// ## Availability Hints |
| 174 | /// This variant is used on Windows systems. |
| 175 | Win32(Win32WindowHandle), |
| 176 | /// A raw window handle for WinRT. |
| 177 | /// |
| 178 | /// ## Availability Hints |
| 179 | /// This variant is used on Windows systems. |
| 180 | WinRt(WinRtWindowHandle), |
| 181 | /// A raw window handle for the Web. |
| 182 | /// |
| 183 | /// ## Availability Hints |
| 184 | /// This variant is used on Wasm or asm.js targets when targeting the Web/HTML5. |
| 185 | Web(WebWindowHandle), |
| 186 | /// A raw window handle for a Web canvas registered via [`wasm-bindgen`]. |
| 187 | /// |
| 188 | /// ## Availability Hints |
| 189 | /// This variant is used on Wasm or asm.js targets when targeting the Web/HTML5. |
| 190 | /// |
| 191 | /// [`wasm-bindgen`]: https://crates.io/crates/wasm-bindgen |
| 192 | WebCanvas(WebCanvasWindowHandle), |
| 193 | /// A raw window handle for a Web offscreen canvas registered via [`wasm-bindgen`]. |
| 194 | /// |
| 195 | /// ## Availability Hints |
| 196 | /// This variant is used on Wasm or asm.js targets when targeting the Web/HTML5. |
| 197 | /// |
| 198 | /// [`wasm-bindgen`]: https://crates.io/crates/wasm-bindgen |
| 199 | WebOffscreenCanvas(WebOffscreenCanvasWindowHandle), |
| 200 | /// A raw window handle for Android NDK. |
| 201 | /// |
| 202 | /// ## Availability Hints |
| 203 | /// This variant is used on Android targets. |
| 204 | AndroidNdk(AndroidNdkWindowHandle), |
| 205 | /// A raw window handle for Haiku. |
| 206 | /// |
| 207 | /// ## Availability Hints |
| 208 | /// This variant is used on HaikuOS. |
| 209 | Haiku(HaikuWindowHandle), |
| 210 | } |
| 211 | |
| 212 | /// Display that wraps around a raw display handle. |
| 213 | /// |
| 214 | /// # Safety |
| 215 | /// |
| 216 | /// Users can safely assume that pointers and non-zero fields are valid, and it is up to the |
| 217 | /// implementer of this trait to ensure that condition is upheld. |
| 218 | /// |
| 219 | /// Despite that qualification, implementers should still make a best-effort attempt to fill in all |
| 220 | /// available fields. If an implementation doesn't, and a downstream user needs the field, it should |
| 221 | /// try to derive the field from other fields the implementer *does* provide via whatever methods the |
| 222 | /// platform provides. |
| 223 | /// |
| 224 | /// The exact handles returned by `raw_display_handle` must remain consistent between multiple calls |
| 225 | /// to `raw_display_handle` as long as not indicated otherwise by platform specific events. |
| 226 | #[deprecated = "Use `HasDisplayHandle` instead" ] |
| 227 | pub unsafe trait HasRawDisplayHandle { |
| 228 | fn raw_display_handle(&self) -> Result<RawDisplayHandle, HandleError>; |
| 229 | } |
| 230 | |
| 231 | #[allow (deprecated)] |
| 232 | unsafe impl<T: HasDisplayHandle + ?Sized> HasRawDisplayHandle for T { |
| 233 | fn raw_display_handle(&self) -> Result<RawDisplayHandle, HandleError> { |
| 234 | self.display_handle().map(op:Into::into) |
| 235 | } |
| 236 | } |
| 237 | |
| 238 | /// A display server handle for a particular windowing system. |
| 239 | /// |
| 240 | /// The display usually represents a connection to some display server, but it is not necessarily |
| 241 | /// tied to a particular window. Some APIs can use the display handle without ever creating a window |
| 242 | /// handle (e.g. offscreen rendering, headless event handling). |
| 243 | /// |
| 244 | /// Each variant contains a struct with fields specific to that windowing system |
| 245 | /// (e.g. [`XlibDisplayHandle`] contains a [Display] connection to an X Server, |
| 246 | /// [`WaylandDisplayHandle`] uses [wl_display] to connect to a compositor). Not all windowing |
| 247 | /// systems have a separate display handle (or they haven't been implemented yet) and their variants |
| 248 | /// contain empty structs. |
| 249 | /// |
| 250 | /// [Display]: https://www.x.org/releases/current/doc/libX11/libX11/libX11.html#Display_Functions |
| 251 | /// [wl_display]: https://wayland.freedesktop.org/docs/html/apb.html#Client-classwl__display |
| 252 | /// |
| 253 | /// # Variant Availability |
| 254 | /// |
| 255 | /// Note that all variants are present on all targets (none are disabled behind |
| 256 | /// `#[cfg]`s), but see the "Availability Hints" section on each variant for |
| 257 | /// some hints on where this variant might be expected. |
| 258 | /// |
| 259 | /// Note that these "Availability Hints" are not normative. That is to say, a |
| 260 | /// [`HasDisplayHandle`] implementor is completely allowed to return something |
| 261 | /// unexpected. (For example, it's legal for someone to return a |
| 262 | /// [`RawDisplayHandle::Xlib`] on macOS, it would just be weird, and probably |
| 263 | /// requires something like XQuartz be used). |
| 264 | #[non_exhaustive ] |
| 265 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)] |
| 266 | pub enum RawDisplayHandle { |
| 267 | /// A raw display handle for UIKit (Apple's non-macOS windowing library). |
| 268 | /// |
| 269 | /// ## Availability Hints |
| 270 | /// This variant is likely to be used on iOS, tvOS, (in theory) watchOS, and |
| 271 | /// Mac Catalyst (`$arch-apple-ios-macabi` targets, which can notably use |
| 272 | /// UIKit *or* AppKit), as these are the targets that (currently) support |
| 273 | /// UIKit. |
| 274 | UiKit(UiKitDisplayHandle), |
| 275 | /// A raw display handle for AppKit. |
| 276 | /// |
| 277 | /// ## Availability Hints |
| 278 | /// This variant is likely to be used on macOS, although Mac Catalyst |
| 279 | /// (`$arch-apple-ios-macabi` targets, which can notably use UIKit *or* |
| 280 | /// AppKit) can also use it despite being `target_os = "ios"`. |
| 281 | AppKit(AppKitDisplayHandle), |
| 282 | /// A raw display handle for the Redox operating system. |
| 283 | /// |
| 284 | /// ## Availability Hints |
| 285 | /// This variant is used by the Orbital Windowing System in the Redox |
| 286 | /// operating system. |
| 287 | Orbital(OrbitalDisplayHandle), |
| 288 | /// A raw display handle for OpenHarmony OS NDK |
| 289 | /// |
| 290 | /// ## Availability Hints |
| 291 | /// This variant is used on OpenHarmony OS (`target_env = "ohos"`). |
| 292 | Ohos(OhosDisplayHandle), |
| 293 | /// A raw display handle for Xlib. |
| 294 | /// |
| 295 | /// ## Availability Hints |
| 296 | /// This variant is likely to show up anywhere someone manages to get X11 |
| 297 | /// working that Xlib can be built for, which is to say, most (but not all) |
| 298 | /// Unix systems. |
| 299 | Xlib(XlibDisplayHandle), |
| 300 | /// A raw display handle for Xcb. |
| 301 | /// |
| 302 | /// ## Availability Hints |
| 303 | /// This variant is likely to show up anywhere someone manages to get X11 |
| 304 | /// working that XCB can be built for, which is to say, most (but not all) |
| 305 | /// Unix systems. |
| 306 | Xcb(XcbDisplayHandle), |
| 307 | /// A raw display handle for Wayland. |
| 308 | /// |
| 309 | /// ## Availability Hints |
| 310 | /// This variant should be expected anywhere Wayland works, which is |
| 311 | /// currently some subset of unix systems. |
| 312 | Wayland(WaylandDisplayHandle), |
| 313 | /// A raw display handle for the Linux Kernel Mode Set/Direct Rendering Manager |
| 314 | /// |
| 315 | /// ## Availability Hints |
| 316 | /// This variant is used on Linux when neither X nor Wayland are available |
| 317 | Drm(DrmDisplayHandle), |
| 318 | /// A raw display handle for the Linux Generic Buffer Manager. |
| 319 | /// |
| 320 | /// ## Availability Hints |
| 321 | /// This variant is present regardless of windowing backend and likely to be used with |
| 322 | /// EGL_MESA_platform_gbm or EGL_KHR_platform_gbm. |
| 323 | Gbm(GbmDisplayHandle), |
| 324 | /// A raw display handle for Win32. |
| 325 | /// |
| 326 | /// ## Availability Hints |
| 327 | /// This variant is used on Windows systems. |
| 328 | Windows(WindowsDisplayHandle), |
| 329 | /// A raw display handle for the Web. |
| 330 | /// |
| 331 | /// ## Availability Hints |
| 332 | /// This variant is used on Wasm or asm.js targets when targeting the Web/HTML5. |
| 333 | Web(WebDisplayHandle), |
| 334 | /// A raw display handle for Android NDK. |
| 335 | /// |
| 336 | /// ## Availability Hints |
| 337 | /// This variant is used on Android targets. |
| 338 | Android(AndroidDisplayHandle), |
| 339 | /// A raw display handle for Haiku. |
| 340 | /// |
| 341 | /// ## Availability Hints |
| 342 | /// This variant is used on HaikuOS. |
| 343 | Haiku(HaikuDisplayHandle), |
| 344 | } |
| 345 | |
| 346 | /// An error that can occur while fetching a display or window handle. |
| 347 | #[derive (Debug, Clone)] |
| 348 | #[non_exhaustive ] |
| 349 | pub enum HandleError { |
| 350 | /// The underlying handle cannot be represented using the types in this crate. |
| 351 | /// |
| 352 | /// This may be returned if the underlying window system does not support any of the |
| 353 | /// representative C window handles in this crate. For instance, if you were using a pure Rust |
| 354 | /// library to set up X11 (like [`x11rb`]), you would not be able to use any of the |
| 355 | /// [`RawWindowHandle`] variants, as they all represent C types. |
| 356 | /// |
| 357 | /// Another example would be a system that isn't supported by `raw-window-handle` yet, |
| 358 | /// like some game consoles. |
| 359 | /// |
| 360 | /// In the event that this error is returned, you should try to use the underlying window |
| 361 | /// system's native API to get the handle you need. |
| 362 | /// |
| 363 | /// [`x11rb`]: https://crates.io/crates/x11rb |
| 364 | NotSupported, |
| 365 | |
| 366 | /// The underlying handle is not available. |
| 367 | /// |
| 368 | /// In some cases the underlying window handle may become temporarily unusable. For example, on |
| 369 | /// Android, the native window pointer can arbitrarily be replaced or removed by the system. In |
| 370 | /// this case, returning a window handle would be disingenuous, as it would not be usable. A |
| 371 | /// similar situation can occur on Wayland for the layer shell windows. |
| 372 | /// |
| 373 | /// In the event that this error is returned, you should wait until the handle becomes available |
| 374 | /// again. |
| 375 | Unavailable, |
| 376 | } |
| 377 | |
| 378 | impl fmt::Display for HandleError { |
| 379 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| 380 | match self { |
| 381 | Self::NotSupported => write!( |
| 382 | f, |
| 383 | "the underlying handle cannot be represented using the types in this crate" |
| 384 | ), |
| 385 | Self::Unavailable => write!(f, "the underlying handle is not available" ), |
| 386 | } |
| 387 | } |
| 388 | } |
| 389 | |
| 390 | #[cfg (feature = "std" )] |
| 391 | impl std::error::Error for HandleError {} |
| 392 | |
| 393 | macro_rules! from_impl { |
| 394 | ($($to:ident, $enum:ident, $from:ty)*) => ($( |
| 395 | impl From<$from> for $to { |
| 396 | fn from(value: $from) -> Self { |
| 397 | $to::$enum(value) |
| 398 | } |
| 399 | } |
| 400 | )*) |
| 401 | } |
| 402 | |
| 403 | from_impl!(RawDisplayHandle, UiKit, UiKitDisplayHandle); |
| 404 | from_impl!(RawDisplayHandle, AppKit, AppKitDisplayHandle); |
| 405 | from_impl!(RawDisplayHandle, Orbital, OrbitalDisplayHandle); |
| 406 | from_impl!(RawDisplayHandle, Ohos, OhosDisplayHandle); |
| 407 | from_impl!(RawDisplayHandle, Xlib, XlibDisplayHandle); |
| 408 | from_impl!(RawDisplayHandle, Xcb, XcbDisplayHandle); |
| 409 | from_impl!(RawDisplayHandle, Wayland, WaylandDisplayHandle); |
| 410 | from_impl!(RawDisplayHandle, Drm, DrmDisplayHandle); |
| 411 | from_impl!(RawDisplayHandle, Gbm, GbmDisplayHandle); |
| 412 | from_impl!(RawDisplayHandle, Windows, WindowsDisplayHandle); |
| 413 | from_impl!(RawDisplayHandle, Web, WebDisplayHandle); |
| 414 | from_impl!(RawDisplayHandle, Android, AndroidDisplayHandle); |
| 415 | from_impl!(RawDisplayHandle, Haiku, HaikuDisplayHandle); |
| 416 | |
| 417 | from_impl!(RawWindowHandle, UiKit, UiKitWindowHandle); |
| 418 | from_impl!(RawWindowHandle, AppKit, AppKitWindowHandle); |
| 419 | from_impl!(RawWindowHandle, Orbital, OrbitalWindowHandle); |
| 420 | from_impl!(RawWindowHandle, OhosNdk, OhosNdkWindowHandle); |
| 421 | from_impl!(RawWindowHandle, Xlib, XlibWindowHandle); |
| 422 | from_impl!(RawWindowHandle, Xcb, XcbWindowHandle); |
| 423 | from_impl!(RawWindowHandle, Wayland, WaylandWindowHandle); |
| 424 | from_impl!(RawWindowHandle, Drm, DrmWindowHandle); |
| 425 | from_impl!(RawWindowHandle, Gbm, GbmWindowHandle); |
| 426 | from_impl!(RawWindowHandle, Win32, Win32WindowHandle); |
| 427 | from_impl!(RawWindowHandle, WinRt, WinRtWindowHandle); |
| 428 | from_impl!(RawWindowHandle, Web, WebWindowHandle); |
| 429 | from_impl!(RawWindowHandle, WebCanvas, WebCanvasWindowHandle); |
| 430 | from_impl!( |
| 431 | RawWindowHandle, |
| 432 | WebOffscreenCanvas, |
| 433 | WebOffscreenCanvasWindowHandle |
| 434 | ); |
| 435 | from_impl!(RawWindowHandle, AndroidNdk, AndroidNdkWindowHandle); |
| 436 | from_impl!(RawWindowHandle, Haiku, HaikuWindowHandle); |
| 437 | |
| 438 | #[cfg (test)] |
| 439 | mod tests { |
| 440 | use core::panic::{RefUnwindSafe, UnwindSafe}; |
| 441 | use static_assertions::{assert_impl_all, assert_not_impl_any}; |
| 442 | |
| 443 | use super::*; |
| 444 | |
| 445 | #[test ] |
| 446 | fn auto_traits() { |
| 447 | assert_impl_all!(RawDisplayHandle: UnwindSafe, RefUnwindSafe, Unpin); |
| 448 | assert_not_impl_any!(RawDisplayHandle: Send, Sync); |
| 449 | assert_impl_all!(DisplayHandle<'_>: UnwindSafe, RefUnwindSafe, Unpin); |
| 450 | assert_not_impl_any!(DisplayHandle<'_>: Send, Sync); |
| 451 | assert_impl_all!(RawWindowHandle: UnwindSafe, RefUnwindSafe, Unpin); |
| 452 | assert_not_impl_any!(RawWindowHandle: Send, Sync); |
| 453 | assert_impl_all!(WindowHandle<'_>: UnwindSafe, RefUnwindSafe, Unpin); |
| 454 | assert_not_impl_any!(WindowHandle<'_>: Send, Sync); |
| 455 | assert_impl_all!(HandleError: Send, Sync, UnwindSafe, RefUnwindSafe, Unpin); |
| 456 | |
| 457 | // TODO: Unsure if some of these should not actually be Send + Sync |
| 458 | assert_impl_all!(UiKitDisplayHandle: Send, Sync); |
| 459 | assert_impl_all!(AppKitDisplayHandle: Send, Sync); |
| 460 | assert_impl_all!(OrbitalDisplayHandle: Send, Sync); |
| 461 | assert_impl_all!(OhosDisplayHandle: Send, Sync); |
| 462 | assert_not_impl_any!(XlibDisplayHandle: Send, Sync); |
| 463 | assert_not_impl_any!(XcbDisplayHandle: Send, Sync); |
| 464 | assert_not_impl_any!(WaylandDisplayHandle: Send, Sync); |
| 465 | assert_impl_all!(DrmDisplayHandle: Send, Sync); |
| 466 | assert_not_impl_any!(GbmDisplayHandle: Send, Sync); |
| 467 | assert_impl_all!(WindowsDisplayHandle: Send, Sync); |
| 468 | assert_impl_all!(WebDisplayHandle: Send, Sync); |
| 469 | assert_impl_all!(AndroidDisplayHandle: Send, Sync); |
| 470 | assert_impl_all!(HaikuDisplayHandle: Send, Sync); |
| 471 | |
| 472 | // TODO: Unsure if some of these should not actually be Send + Sync |
| 473 | assert_not_impl_any!(UiKitWindowHandle: Send, Sync); |
| 474 | assert_not_impl_any!(AppKitWindowHandle: Send, Sync); |
| 475 | assert_not_impl_any!(OrbitalWindowHandle: Send, Sync); |
| 476 | assert_not_impl_any!(OhosNdkWindowHandle: Send, Sync); |
| 477 | assert_impl_all!(XlibWindowHandle: Send, Sync); |
| 478 | assert_impl_all!(XcbWindowHandle: Send, Sync); |
| 479 | assert_not_impl_any!(WaylandWindowHandle: Send, Sync); |
| 480 | assert_impl_all!(DrmWindowHandle: Send, Sync); |
| 481 | assert_not_impl_any!(GbmWindowHandle: Send, Sync); |
| 482 | assert_impl_all!(Win32WindowHandle: Send, Sync); |
| 483 | assert_not_impl_any!(WinRtWindowHandle: Send, Sync); |
| 484 | assert_impl_all!(WebWindowHandle: Send, Sync); |
| 485 | assert_not_impl_any!(WebCanvasWindowHandle: Send, Sync); |
| 486 | assert_not_impl_any!(WebOffscreenCanvasWindowHandle: Send, Sync); |
| 487 | assert_not_impl_any!(AndroidNdkWindowHandle: Send, Sync); |
| 488 | assert_not_impl_any!(HaikuWindowHandle: Send, Sync); |
| 489 | } |
| 490 | |
| 491 | #[allow (deprecated, unused)] |
| 492 | fn assert_object_safe( |
| 493 | _: &dyn HasRawWindowHandle, |
| 494 | _: &dyn HasRawDisplayHandle, |
| 495 | _: &dyn HasWindowHandle, |
| 496 | _: &dyn HasDisplayHandle, |
| 497 | ) { |
| 498 | } |
| 499 | } |
| 500 | |