| 1 | //! [OpenHarmony] OS Window Handles |
| 2 | //! |
| 3 | //! ## Background |
| 4 | //! |
| 5 | //! Applications on [OpenHarmony] use [ArkUI] for defining their UI. Applications can use an |
| 6 | //! [XComponent] to render using native Code (e.g. Rust) via EGL. |
| 7 | //! Native code will receive a callback `OnSurfaceCreatedCB(OH_NativeXComponent *component, void *window)` |
| 8 | //! when the `XComponent` is created. The window argument has the type [`OHNativeWindow`] / `EGLNativeWindowType`. |
| 9 | //! The window can then be used to create a surface with |
| 10 | //! `eglCreateWindowSurface(eglDisplay_, eglConfig_, window, NULL)` |
| 11 | //! |
| 12 | //! [OpenHarmony]: https://gitee.com/openharmony/docs/blob/master/en/OpenHarmony-Overview.md |
| 13 | //! [ArkUI]: https://gitee.com/openharmony/docs/blob/master/en/application-dev/ui/arkui-overview.md |
| 14 | //! [XComponent]: https://gitee.com/openharmony/docs/blob/master/en/application-dev/ui/arkts-common-components-xcomponent.md |
| 15 | //! [`OHNativeWindow`]: https://gitee.com/openharmony/docs/blob/master/en/application-dev/reference/apis-arkgraphics2d/_native_window.md |
| 16 | |
| 17 | use core::ffi::c_void; |
| 18 | use core::ptr::NonNull; |
| 19 | |
| 20 | use super::DisplayHandle; |
| 21 | |
| 22 | /// Raw display handle for OpenHarmony. |
| 23 | #[non_exhaustive ] |
| 24 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)] |
| 25 | pub struct OhosDisplayHandle {} |
| 26 | |
| 27 | impl OhosDisplayHandle { |
| 28 | /// Create a new empty display handle. |
| 29 | /// |
| 30 | /// |
| 31 | /// # Example |
| 32 | /// |
| 33 | /// ``` |
| 34 | /// # use raw_window_handle::OhosDisplayHandle; |
| 35 | /// let handle = OhosDisplayHandle::new(); |
| 36 | /// ``` |
| 37 | pub fn new() -> Self { |
| 38 | Self {} |
| 39 | } |
| 40 | } |
| 41 | |
| 42 | impl DisplayHandle<'static> { |
| 43 | /// Create an OpenHarmony-based display handle. |
| 44 | /// |
| 45 | /// As no data is borrowed by this handle, it is completely safe to create. This function |
| 46 | /// may be useful to windowing framework implementations that want to avoid unsafe code. |
| 47 | /// |
| 48 | /// # Example |
| 49 | /// |
| 50 | /// ``` |
| 51 | /// # use raw_window_handle::{DisplayHandle, HasDisplayHandle}; |
| 52 | /// # fn do_something(rwh: impl HasDisplayHandle) { let _ = rwh; } |
| 53 | /// let handle = DisplayHandle::ohos(); |
| 54 | /// do_something(handle); |
| 55 | /// ``` |
| 56 | pub fn ohos() -> Self { |
| 57 | // SAFETY: No data is borrowed. |
| 58 | unsafe { Self::borrow_raw(OhosDisplayHandle::new().into()) } |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | /// Raw window handle for Ohos NDK. |
| 63 | #[non_exhaustive ] |
| 64 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)] |
| 65 | pub struct OhosNdkWindowHandle { |
| 66 | pub native_window: NonNull<c_void>, |
| 67 | } |
| 68 | |
| 69 | impl OhosNdkWindowHandle { |
| 70 | /// Create a new handle to an [`OHNativeWindow`] on OpenHarmony. |
| 71 | /// |
| 72 | /// The handle will typically be created from an [`XComponent`], consult the |
| 73 | /// [native `XComponent` Guidelines] for more details. |
| 74 | /// |
| 75 | /// [`XComponent`]: https://gitee.com/openharmony/docs/blob/master/en/application-dev/ui/arkts-common-components-xcomponent.md |
| 76 | /// [native `XComponent` Guidelines]: https://gitee.com/openharmony/docs/blob/OpenHarmony-4.0-Release/en/application-dev/napi/xcomponent-guidelines.md |
| 77 | /// [`OHNativeWindow`]: https://gitee.com/openharmony/docs/blob/master/en/application-dev/reference/apis-arkgraphics2d/_native_window.md |
| 78 | /// # Example |
| 79 | /// |
| 80 | /// ``` |
| 81 | /// # use core::ptr::NonNull; |
| 82 | /// # use core::ffi::c_void; |
| 83 | /// # use raw_window_handle::OhosNdkWindowHandle; |
| 84 | /// # #[allow (non_camel_case_types)] |
| 85 | /// # type OH_NativeXComponent = (); |
| 86 | /// |
| 87 | /// /// Called When the `XComponent` is created. |
| 88 | /// /// |
| 89 | /// /// See the [XComponent Guidelines](https://gitee.com/openharmony/docs/blob/OpenHarmony-4.0-Release/en/application-dev/napi/xcomponent-guidelines.md) |
| 90 | /// /// for more details |
| 91 | /// extern "C" fn on_surface_created_callback(component: *mut OH_NativeXComponent, window: *mut c_void) { |
| 92 | /// let handle = OhosNdkWindowHandle::new(NonNull::new(window).unwrap()); |
| 93 | /// } |
| 94 | /// ``` |
| 95 | pub fn new(native_window: NonNull<c_void>) -> Self { |
| 96 | Self { native_window } |
| 97 | } |
| 98 | } |
| 99 | |