use crate::coordinates::Size;
use crate::sys;
use crate::window::WindowOwner;
use raw_window_handle::{DisplayHandle, RawDisplayHandle, RawWindowHandle, WindowHandle};
use std::sync::Arc;
#[derive(Debug)]
#[must_use = "Dropping a surface may release resources"]
pub struct Surface {
pub(super) sys: sys::Surface,
_window_owner: Arc<WindowOwner>,
}
impl Surface {
pub(crate) fn new(sys: sys::Surface, window_owner: Arc<WindowOwner>) -> Surface {
Surface {
sys,
_window_owner: window_owner,
}
}
pub async fn size_scale(&self) -> (Size, f64) {
let observed = self.sys.size_scale().await;
#[cfg(feature = "exfiltrate")]
if let Some(id) = self._window_owner.registry_id {
crate::registry::observed(id, observed.0, observed.1);
}
observed
}
pub fn size_main(&self) -> (Size, f64) {
assert!(
sys::is_main_thread(),
"`size_main` must be called from the main thread"
);
self.sys.size_main()
}
pub fn raw_window_handle(&self) -> RawWindowHandle {
self.sys.raw_window_handle()
}
pub fn window_handle(&self) -> WindowHandle<'_> {
unsafe { WindowHandle::borrow_raw(self.raw_window_handle()) }
}
pub fn raw_display_handle(&self) -> RawDisplayHandle {
self.sys.raw_display_handle()
}
pub fn display_handle(&self) -> DisplayHandle<'_> {
unsafe { DisplayHandle::borrow_raw(self.raw_display_handle()) }
}
pub fn size_update<F: Fn(Size) + Send + 'static>(&mut self, update: F) {
self.sys.size_update(update)
}
}
#[cfg(test)]
mod tests {
use crate::surface::Surface;
#[cfg_attr(target_arch = "wasm32", wasm_lite::wasm_lite_test)]
#[test]
fn send_sync() {
fn assert_send<T: Send + Sync>() {}
assert_send::<Surface>();
}
}