1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2023 The ChromiumOS Authors 2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file. 4*bb4ee6a4SAndroid Build Coastguard Worker 5*bb4ee6a4SAndroid Build Coastguard Worker cfg_if::cfg_if! { 6*bb4ee6a4SAndroid Build Coastguard Worker if #[cfg(unix)] { 7*bb4ee6a4SAndroid Build Coastguard Worker pub mod unix; 8*bb4ee6a4SAndroid Build Coastguard Worker pub use unix as platform; 9*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) use self::unix::StubWindowEventLoop as PlatformWindowEventLoop; 10*bb4ee6a4SAndroid Build Coastguard Worker } else if #[cfg(windows)] { 11*bb4ee6a4SAndroid Build Coastguard Worker pub mod windows; 12*bb4ee6a4SAndroid Build Coastguard Worker pub use windows as platform; 13*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) use self::windows::WindowsWindowEventLoop as PlatformWindowEventLoop; 14*bb4ee6a4SAndroid Build Coastguard Worker } 15*bb4ee6a4SAndroid Build Coastguard Worker } 16*bb4ee6a4SAndroid Build Coastguard Worker 17*bb4ee6a4SAndroid Build Coastguard Worker use std::any::Any; 18*bb4ee6a4SAndroid Build Coastguard Worker use std::sync::Arc; 19*bb4ee6a4SAndroid Build Coastguard Worker 20*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::Result; 21*bb4ee6a4SAndroid Build Coastguard Worker use euclid::Box2D; 22*bb4ee6a4SAndroid Build Coastguard Worker use euclid::Size2D; 23*bb4ee6a4SAndroid Build Coastguard Worker use euclid::UnknownUnit; 24*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::instance::Instance; 25*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::swapchain; 26*bb4ee6a4SAndroid Build Coastguard Worker 27*bb4ee6a4SAndroid Build Coastguard Worker type Surface = swapchain::Surface<Arc<dyn Any + Send + Sync>>; 28*bb4ee6a4SAndroid Build Coastguard Worker 29*bb4ee6a4SAndroid Build Coastguard Worker pub trait Window: Any + Send + Sync { get_inner_size(&self) -> Result<Size2D<u32, UnknownUnit>>30*bb4ee6a4SAndroid Build Coastguard Worker fn get_inner_size(&self) -> Result<Size2D<u32, UnknownUnit>>; create_vulkan_surface(self: Arc<Self>, instance: Arc<Instance>) -> Result<Arc<Surface>>31*bb4ee6a4SAndroid Build Coastguard Worker fn create_vulkan_surface(self: Arc<Self>, instance: Arc<Instance>) -> Result<Arc<Surface>>; 32*bb4ee6a4SAndroid Build Coastguard Worker } 33*bb4ee6a4SAndroid Build Coastguard Worker 34*bb4ee6a4SAndroid Build Coastguard Worker pub trait ApplicationState { 35*bb4ee6a4SAndroid Build Coastguard Worker type UserEvent: Send + 'static; 36*bb4ee6a4SAndroid Build Coastguard Worker process_event(&self, event: WindowEvent<Self::UserEvent>)37*bb4ee6a4SAndroid Build Coastguard Worker fn process_event(&self, event: WindowEvent<Self::UserEvent>); 38*bb4ee6a4SAndroid Build Coastguard Worker } 39*bb4ee6a4SAndroid Build Coastguard Worker 40*bb4ee6a4SAndroid Build Coastguard Worker pub trait ApplicationStateBuilder: Send + 'static { 41*bb4ee6a4SAndroid Build Coastguard Worker type Target: ApplicationState; 42*bb4ee6a4SAndroid Build Coastguard Worker build<T: Window>(self, window: Arc<T>) -> Result<Self::Target>43*bb4ee6a4SAndroid Build Coastguard Worker fn build<T: Window>(self, window: Arc<T>) -> Result<Self::Target>; 44*bb4ee6a4SAndroid Build Coastguard Worker } 45*bb4ee6a4SAndroid Build Coastguard Worker 46*bb4ee6a4SAndroid Build Coastguard Worker // Some platform may not support all the events. 47*bb4ee6a4SAndroid Build Coastguard Worker #[allow(dead_code)] 48*bb4ee6a4SAndroid Build Coastguard Worker pub enum WindowEvent<T: Send> { 49*bb4ee6a4SAndroid Build Coastguard Worker Resized, 50*bb4ee6a4SAndroid Build Coastguard Worker User(T), 51*bb4ee6a4SAndroid Build Coastguard Worker } 52*bb4ee6a4SAndroid Build Coastguard Worker 53*bb4ee6a4SAndroid Build Coastguard Worker pub trait WindowEventLoop<State: ApplicationState>: Sized + Send { 54*bb4ee6a4SAndroid Build Coastguard Worker type WindowType: Window; 55*bb4ee6a4SAndroid Build Coastguard Worker 56*bb4ee6a4SAndroid Build Coastguard Worker /// # Safety 57*bb4ee6a4SAndroid Build Coastguard Worker /// The parent window must outlive the lifetime of this object. create<Builder>( parent: platform::NativeWindowType, initial_window_size: &Size2D<i32, UnknownUnit>, application_state_builder: Builder, ) -> Result<Self> where Builder: ApplicationStateBuilder<Target = State>58*bb4ee6a4SAndroid Build Coastguard Worker unsafe fn create<Builder>( 59*bb4ee6a4SAndroid Build Coastguard Worker parent: platform::NativeWindowType, 60*bb4ee6a4SAndroid Build Coastguard Worker initial_window_size: &Size2D<i32, UnknownUnit>, 61*bb4ee6a4SAndroid Build Coastguard Worker application_state_builder: Builder, 62*bb4ee6a4SAndroid Build Coastguard Worker ) -> Result<Self> 63*bb4ee6a4SAndroid Build Coastguard Worker where 64*bb4ee6a4SAndroid Build Coastguard Worker Builder: ApplicationStateBuilder<Target = State>; 65*bb4ee6a4SAndroid Build Coastguard Worker send_event(&self, event: State::UserEvent) -> Result<()>66*bb4ee6a4SAndroid Build Coastguard Worker fn send_event(&self, event: State::UserEvent) -> Result<()>; 67*bb4ee6a4SAndroid Build Coastguard Worker move_window(&self, pos: &Box2D<i32, UnknownUnit>) -> Result<()>68*bb4ee6a4SAndroid Build Coastguard Worker fn move_window(&self, pos: &Box2D<i32, UnknownUnit>) -> Result<()>; 69*bb4ee6a4SAndroid Build Coastguard Worker } 70