ohos-xcomponent-binding 0.2.0

OpenHarmony's xcomponent binding for rust
use raw_window_handle::{OhosNdkWindowHandle, RawWindowHandle};
use std::{
    os::raw::c_void,
    ptr::NonNull,
    sync::{LazyLock, RwLock},
};

// Same with WindowRaw, but thread safe.
#[derive(Debug, Clone, Copy)]
pub struct RawWindow {
    pub(crate) raw: *mut c_void,
}

unsafe impl Send for RawWindow {}
unsafe impl Sync for RawWindow {}

impl RawWindow {
    pub fn new(window: *mut c_void) -> Self {
        RawWindow { raw: window }
    }

    pub fn raw(&self) -> *mut c_void {
        self.raw
    }

    /// Get window handle
    pub fn raw_window_handle(&self) -> Option<RawWindowHandle> {
        let guard = (*RAW_WINDOW).read();
        if let Ok(guard) = guard {
            if let Some(win) = &*guard {
                let win = NonNull::new(win.raw);
                if let Some(win) = win {
                    return Some(RawWindowHandle::OhosNdk(OhosNdkWindowHandle::new(win)));
                }
                return None;
            }
            return None;
        }
        None
    }
}

pub(crate) static RAW_WINDOW: LazyLock<RwLock<Option<RawWindow>>> =
    LazyLock::new(|| RwLock::new(None));