diff --git a/src/platform_impl/web/event_loop/mod.rs b/src/platform_impl/web/event_loop/mod.rs index 28598dde8c..1dcee87840 100644 --- a/src/platform_impl/web/event_loop/mod.rs +++ b/src/platform_impl/web/event_loop/mod.rs @@ -8,9 +8,7 @@ pub use self::window_target::EventLoopWindowTarget; use super::{backend, device, window}; use crate::event::Event; -use crate::event_loop::{ - ControlFlow, EventLoopBuilder, EventLoopWindowTarget as RootEventLoopWindowTarget, -}; +use crate::event_loop::{ControlFlow, EventLoopWindowTarget as RootEventLoopWindowTarget}; use std::marker::PhantomData; @@ -35,7 +33,7 @@ impl EventLoop { where F: 'static + FnMut(Event<'_, T>, &RootEventLoopWindowTarget, &mut ControlFlow), { - self.spawn_inner(event_handler); + self.spawn_inner(event_handler, false); // Throw an exception to break out of Rust execution and use unreachable to tell the // compiler this function won't return, giving it a return type of '!' @@ -50,11 +48,10 @@ impl EventLoop { where F: 'static + FnMut(Event<'_, T>, &RootEventLoopWindowTarget, &mut ControlFlow), { - EventLoopBuilder::::allow_event_loop_recreation(); - self.spawn_inner(event_handler); + self.spawn_inner(event_handler, true); } - fn spawn_inner(self, mut event_handler: F) + fn spawn_inner(self, mut event_handler: F, event_loop_recreation: bool) where F: 'static + FnMut(Event<'_, T>, &RootEventLoopWindowTarget, &mut ControlFlow), { @@ -63,9 +60,10 @@ impl EventLoop { _marker: PhantomData, }; - self.elw.p.run(Box::new(move |event, flow| { - event_handler(event, &target, flow) - })); + self.elw.p.run( + Box::new(move |event, flow| event_handler(event, &target, flow)), + event_loop_recreation, + ); } pub fn create_proxy(&self) -> EventLoopProxy { diff --git a/src/platform_impl/web/event_loop/runner.rs b/src/platform_impl/web/event_loop/runner.rs index df4c7fabb7..34267963d5 100644 --- a/src/platform_impl/web/event_loop/runner.rs +++ b/src/platform_impl/web/event_loop/runner.rs @@ -35,6 +35,7 @@ type OnEventHandle = RefCell>>; pub struct Execution { runner: RefCell>, + event_loop_recreation: Cell, events: RefCell>>, id: RefCell, window: web_sys::Window, @@ -139,6 +140,7 @@ impl Shared { pub fn new() -> Self { Shared(Rc::new(Execution { runner: RefCell::new(RunnerEnum::Pending), + event_loop_recreation: Cell::new(false), events: RefCell::new(VecDeque::new()), #[allow(clippy::disallowed_methods)] window: web_sys::window().expect("only callable from inside the `Window`"), @@ -633,6 +635,9 @@ impl Shared { // * For each undropped `Window`: // * The `register_redraw_request` closure. // * The `destroy_fn` closure. + if self.0.event_loop_recreation.get() { + crate::event_loop::EventLoopBuilder::::allow_event_loop_recreation(); + } } // Check if the event loop is currently closed @@ -675,6 +680,10 @@ impl Shared { DeviceEvents::Never => false, } } + + pub fn event_loop_recreation(&self, allow: bool) { + self.0.event_loop_recreation.set(allow) + } } pub(crate) enum EventWrapper { diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index 8cfbb42756..7534aa7b16 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -69,7 +69,8 @@ impl EventLoopWindowTarget { EventLoopProxy::new(self.runner.clone()) } - pub fn run(&self, event_handler: Box>) { + pub fn run(&self, event_handler: Box>, event_loop_recreation: bool) { + self.runner.event_loop_recreation(event_loop_recreation); self.runner.set_listener(event_handler); }