diff options
author | 2024-09-13 19:15:15 -0300 | |
---|---|---|
committer | 2024-09-13 22:15:15 +0000 | |
commit | d46f6f92ce1f5f2776ab48f74dbd4439b1f17e9f (patch) | |
tree | d252d5393e9f2ede6b84f0978b14b9a5d4dfb3f3 | |
parent | f3b51e40f006bc7c6ee2d3560820c922081aa8b0 (diff) | |
download | iced-d46f6f92ce1f5f2776ab48f74dbd4439b1f17e9f.tar.gz iced-d46f6f92ce1f5f2776ab48f74dbd4439b1f17e9f.tar.bz2 iced-d46f6f92ce1f5f2776ab48f74dbd4439b1f17e9f.zip |
Fix `wasm32` deployments not displaying anything (#2574)
* 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 <hector@hecrj.dev>
-rw-r--r-- | winit/Cargo.toml | 2 | ||||
-rw-r--r-- | 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<std::cell::RefCell<bool>>, #[cfg(target_arch = "wasm32")] - queued_events: Vec<Event<Action<Message>>>, + canvas: Option<web_sys::HtmlCanvasElement>, } struct BootConfig<C> { @@ -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<Message, F, C> winit::application::ApplicationHandler<Action<Message>> @@ -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<Action<Message>>, ) { - #[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")] |