summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Richard <30560559+derezzedex@users.noreply.github.com>2024-09-13 19:15:15 -0300
committerLibravatar GitHub <noreply@github.com>2024-09-13 22:15:15 +0000
commitd46f6f92ce1f5f2776ab48f74dbd4439b1f17e9f (patch)
treed252d5393e9f2ede6b84f0978b14b9a5d4dfb3f3
parentf3b51e40f006bc7c6ee2d3560820c922081aa8b0 (diff)
downloadiced-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.toml2
-rw-r--r--winit/src/program.rs67
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")]