//! Platform-independent window API and handler trait. 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, PhySize, 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; /// Opaque handle to an open window, used to close it or check liveness. 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() } } /// Trait implemented by the application to receive window events and frame callbacks. pub trait WindowHandler { fn on_frame(&mut self, window: &mut Window); fn on_event(&mut self, window: &mut Window, event: Event) -> EventStatus; } /// A window that can be drawn to and receive events. 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 } } /// Open a window as a child of the given parent. 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)
}
/// Open a standalone window and block until it is closed.
pub fn open_blocking