use std::marker::PhantomData; use raw_window_handle::{ HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle, RawWindowHandle, }; use crate::event::{Event, EventStatus}; use crate::window_open_options::WindowOpenOptions; use crate::{MouseCursor, Size}; #[cfg(target_os = "macos")] use crate::macos as platform; #[cfg(target_os = "windows")] use crate::win as platform; #[cfg(target_os = "linux")] use crate::x11 as platform; pub struct WindowHandle { window_handle: platform::WindowHandle, // so that WindowHandle is !Send on all platforms phantom: PhantomData<*mut ()>, } impl WindowHandle { fn new(window_handle: platform::WindowHandle) -> Self { Self { window_handle, phantom: PhantomData } } /// Close the window pub fn close(&mut self) { self.window_handle.close(); } /// Returns `true` if the window is still open, and returns `false` /// if the window was closed/dropped. pub fn is_open(&self) -> bool { self.window_handle.is_open() } } unsafe impl HasRawWindowHandle for WindowHandle { fn raw_window_handle(&self) -> RawWindowHandle { self.window_handle.raw_window_handle() } } pub trait WindowHandler { fn on_frame(&mut self, window: &mut Window); fn on_event(&mut self, window: &mut Window, event: Event) -> EventStatus; } pub struct Window<'a> { window: platform::Window<'a>, // so that Window is !Send on all platforms phantom: PhantomData<*mut ()>, } impl<'a> Window<'a> { #[cfg(target_os = "windows")] pub(crate) fn new(window: platform::Window<'a>) -> Window<'a> { Window { window, phantom: PhantomData } } #[cfg(not(target_os = "windows"))] pub(crate) fn new(window: platform::Window) -> Window { Window { window, phantom: PhantomData } } pub fn open_parented
(parent: &P, options: WindowOpenOptions, build: B) -> WindowHandle where P: HasRawWindowHandle, H: WindowHandler + 'static, B: FnOnce(&mut Window) -> H, B: Send + 'static, { let window_handle = platform::Window::open_parented::
(parent, options, build);
WindowHandle::new(window_handle)
}
pub fn open_blocking