use raw_window_handle::{OhosNdkWindowHandle, RawWindowHandle};
use std::{
os::raw::c_void,
ptr::NonNull,
sync::{LazyLock, RwLock},
};
#[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
}
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));