summaryrefslogtreecommitdiffstats
path: root/winit/src
diff options
context:
space:
mode:
Diffstat (limited to 'winit/src')
-rw-r--r--winit/src/program.rs67
1 files changed, 41 insertions, 26 deletions
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")]