use std::ffi::c_char; use winit::event_loop::ActiveEventLoop; use winit::raw_window_handle::HasDisplayHandle; pub struct Window { handle: Option, window_attributes: winit::window::WindowAttributes, } impl Window { pub fn new(window_attributes: winit::window::WindowAttributes) -> Self { Self { handle: None, window_attributes, } } pub fn create_window(&mut self, event_loop: &ActiveEventLoop) -> anyhow::Result<()> { let window = event_loop.create_window(self.window_attributes.clone())?; self.handle = Some(window); Ok(()) } pub fn required_extensions(&self) -> anyhow::Result> { let display_handle = self .handle .as_ref() .ok_or_else(|| anyhow::anyhow!("Window not found"))? .display_handle()?; #[allow(unused_mut)] let mut extension_names = ash_window::enumerate_required_extensions(display_handle.as_raw())?.to_vec(); // TODO: Move this because is not related to Window extensions #[cfg(any(target_os = "macos", target_os = "ios"))] { extension_names.push(ash::khr::portability_enumeration::NAME.as_ptr()); // Enabling this extension is a requirement when using `VK_KHR_portability_subset` extension_names.push(ash::khr::get_physical_device_properties2::NAME.as_ptr()); } Ok(extension_names) } pub fn handle(&self) -> Option<&winit::window::Window> { self.handle.as_ref() } pub fn size(&self) -> Option { self.window_attributes.inner_size } pub fn request_redraw(&self) { match self.handle.as_ref() { Some(window) => window.request_redraw(), None => log::warn!("Redraw requested but no window found"), } } }