From d46f6f92ce1f5f2776ab48f74dbd4439b1f17e9f Mon Sep 17 00:00:00 2001 From: Richard <30560559+derezzedex@users.noreply.github.com> Date: Fri, 13 Sep 2024 19:15:15 -0300 Subject: Fix `wasm32` deployments not displaying anything (#2574) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * reuse `canvas` element generated by dummy window * fix formatting * set `control_flow` to `Poll` in `resumed` this is mostly a fix for Chrome * Avoid blowing up memory when booting up on Wasm --------- Co-authored-by: Héctor Ramón Jiménez --- winit/Cargo.toml | 2 +- winit/src/program.rs | 67 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/winit/Cargo.toml b/winit/Cargo.toml index f5a47952..bd6feb00 100644 --- a/winit/Cargo.toml +++ b/winit/Cargo.toml @@ -44,5 +44,5 @@ winapi.workspace = true [target.'cfg(target_arch = "wasm32")'.dependencies] web-sys.workspace = true -web-sys.features = ["Document", "Window"] +web-sys.features = ["Document", "Window", "HtmlCanvasElement"] wasm-bindgen-futures.workspace = true diff --git a/winit/src/program.rs b/winit/src/program.rs index eef7e6c6..7cfbd2d5 100644 --- a/winit/src/program.rs +++ b/winit/src/program.rs @@ -251,7 +251,7 @@ where #[cfg(target_arch = "wasm32")] is_booted: std::rc::Rc>, #[cfg(target_arch = "wasm32")] - queued_events: Vec>>, + canvas: Option, } struct BootConfig { @@ -276,7 +276,7 @@ where #[cfg(target_arch = "wasm32")] is_booted: std::rc::Rc::new(std::cell::RefCell::new(false)), #[cfg(target_arch = "wasm32")] - queued_events: Vec::new(), + canvas: None, }; impl winit::application::ApplicationHandler> @@ -307,6 +307,12 @@ where } }; + #[cfg(target_arch = "wasm32")] + { + use winit::platform::web::WindowExtWebSys; + self.canvas = window.canvas(); + } + let finish_boot = async move { let mut compositor = C::new(graphics_settings, window.clone()).await?; @@ -340,6 +346,9 @@ where *is_booted.borrow_mut() = true; }); + + event_loop + .set_control_flow(winit::event_loop::ControlFlow::Poll); } } @@ -352,6 +361,11 @@ where return; } + #[cfg(target_arch = "wasm32")] + if !*self.is_booted.borrow() { + return; + } + self.process_event( event_loop, Event::EventLoopAwakened(winit::event::Event::NewEvents(cause)), @@ -430,6 +444,11 @@ where &mut self, event_loop: &winit::event_loop::ActiveEventLoop, ) { + #[cfg(target_arch = "wasm32")] + if !*self.is_booted.borrow() { + return; + } + self.process_event( event_loop, Event::EventLoopAwakened(winit::event::Event::AboutToWait), @@ -447,19 +466,6 @@ where event_loop: &winit::event_loop::ActiveEventLoop, event: Event>, ) { - #[cfg(target_arch = "wasm32")] - if !*self.is_booted.borrow() { - self.queued_events.push(event); - return; - } else if !self.queued_events.is_empty() { - let queued_events = std::mem::take(&mut self.queued_events); - - // This won't infinitely recurse, since we `mem::take` - for event in queued_events { - self.process_event(event_loop, event); - } - } - if event_loop.exiting() { return; } @@ -505,18 +511,27 @@ where let target = settings.platform_specific.target.clone(); - let window = event_loop - .create_window( - conversion::window_attributes( - settings, - &title, - monitor - .or(event_loop - .primary_monitor()), - self.id.clone(), - ) - .with_visible(false), + let window_attributes = + conversion::window_attributes( + settings, + &title, + monitor + .or(event_loop.primary_monitor()), + self.id.clone(), ) + .with_visible(false); + + #[cfg(target_arch = "wasm32")] + let window_attributes = { + use winit::platform::web::WindowAttributesExtWebSys; + window_attributes + .with_canvas(self.canvas.take()) + }; + + log::info!("Window attributes for id `{id:#?}`: {window_attributes:#?}"); + + let window = event_loop + .create_window(window_attributes) .expect("Create window"); #[cfg(target_arch = "wasm32")] -- cgit