From 42c9b7e40e84ba66c4d00adeddbf9e25952fdd51 Mon Sep 17 00:00:00 2001 From: daxpedda Date: Tue, 10 Oct 2023 22:46:08 +0200 Subject: [PATCH] Fix reset to `Poll` after the event loop starts --- README.md | 1 + src/lib.rs | 17 +++++++++-------- src/platform_impl/android/mod.rs | 5 ----- src/platform_impl/ios/app_state.rs | 7 +------ .../linux/wayland/event_loop/mod.rs | 9 --------- src/platform_impl/linux/x11/mod.rs | 9 --------- src/platform_impl/macos/app_state.rs | 1 - src/platform_impl/windows/event_loop/runner.rs | 3 +-- src/window.rs | 1 + 9 files changed, 13 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 9f4bbb40..b84b6402 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ use winit::{ fn main() { let event_loop = EventLoop::new(); + event_loop.set_control_flow(ControlFlow::Wait); let window = WindowBuilder::new().build(&event_loop).unwrap(); event_loop.run(move |event, elwt| { diff --git a/src/lib.rs b/src/lib.rs index 86e10e1e..651681d7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -49,15 +49,16 @@ //! let event_loop = EventLoop::new().unwrap(); //! let window = WindowBuilder::new().build(&event_loop).unwrap(); //! -//! event_loop.run(move |event, elwt| { -//! // ControlFlow::Poll continuously runs the event loop, even if the OS hasn't -//! // dispatched any events. This is ideal for games and similar applications. -//! elwt.set_control_flow(ControlFlow::Poll); +//! // ControlFlow::Poll continuously runs the event loop, even if the OS hasn't +//! // dispatched any events. This is ideal for games and similar applications. +//! event_loop.set_control_flow(ControlFlow::Poll); //! -//! // ControlFlow::Wait pauses the event loop if no events are available to process. -//! // This is ideal for non-game applications that only update in response to user -//! // input, and uses significantly less power/CPU time than ControlFlow::Poll. -//! elwt.set_control_flow(ControlFlow::Wait); +//! // ControlFlow::Wait pauses the event loop if no events are available to process. +//! // This is ideal for non-game applications that only update in response to user +//! // input, and uses significantly less power/CPU time than ControlFlow::Poll. +//! event_loop.set_control_flow(ControlFlow::Wait); +//! +//! event_loop.run(move |event, elwt| { //! match event { //! Event::WindowEvent { //! event: WindowEvent::CloseRequested, diff --git a/src/platform_impl/android/mod.rs b/src/platform_impl/android/mod.rs index 37bcc75f..aa9ad2d5 100644 --- a/src/platform_impl/android/mod.rs +++ b/src/platform_impl/android/mod.rs @@ -526,7 +526,6 @@ impl EventLoop { // than once self.pending_redraw = false; self.cause = StartCause::Init; - self.set_control_flow(ControlFlow::default()); // run the initial loop iteration self.single_iteration(None, &mut callback); @@ -637,10 +636,6 @@ impl EventLoop { } } - fn set_control_flow(&self, control_flow: ControlFlow) { - self.window_target.p.set_control_flow(control_flow) - } - fn control_flow(&self) -> ControlFlow { self.window_target.p.control_flow() } diff --git a/src/platform_impl/ios/app_state.rs b/src/platform_impl/ios/app_state.rs index 6dd7bf83..5a4a9cb2 100644 --- a/src/platform_impl/ios/app_state.rs +++ b/src/platform_impl/ios/app_state.rs @@ -234,7 +234,7 @@ impl AppState { }; self.set_state(AppStateImpl::ProcessingEvents { event_handler, - active_control_flow: ControlFlow::Poll, + active_control_flow: self.control_flow, queued_gpu_redraws, }); (windows, events) @@ -523,11 +523,6 @@ pub fn did_finish_launching(mtm: MainThreadMarker) { s => bug!("unexpected state {:?}", s), }; - // start waking up the event loop now! - bug_assert!( - this.control_flow == ControlFlow::Poll, - "unexpectedly not setup to `Poll` on launch!" - ); this.waker.start(); // have to drop RefMut because the window setup code below can trigger new events diff --git a/src/platform_impl/linux/wayland/event_loop/mod.rs b/src/platform_impl/linux/wayland/event_loop/mod.rs index b22f2ce5..c0baead6 100644 --- a/src/platform_impl/linux/wayland/event_loop/mod.rs +++ b/src/platform_impl/linux/wayland/event_loop/mod.rs @@ -227,11 +227,6 @@ impl EventLoop { if !self.loop_running { self.loop_running = true; - // Reset the internal state for the loop as we start running to - // ensure consistent behaviour in case the loop runs and exits more - // than once. - self.set_control_flow(ControlFlow::Poll); - // Run the initial loop iteration. self.single_iteration(&mut callback, StartCause::Init); } @@ -611,10 +606,6 @@ impl EventLoop { }) } - fn set_control_flow(&self, control_flow: ControlFlow) { - self.window_target.p.set_control_flow(control_flow) - } - fn control_flow(&self) -> ControlFlow { self.window_target.p.control_flow() } diff --git a/src/platform_impl/linux/x11/mod.rs b/src/platform_impl/linux/x11/mod.rs index 1f1da606..037426a0 100644 --- a/src/platform_impl/linux/x11/mod.rs +++ b/src/platform_impl/linux/x11/mod.rs @@ -439,11 +439,6 @@ impl EventLoop { if !self.loop_running { self.loop_running = true; - // Reset the internal state for the loop as we start running to - // ensure consistent behaviour in case the loop runs and exits more - // than once. - self.set_control_flow(ControlFlow::Poll); - // run the initial loop iteration self.single_iteration(&mut callback, StartCause::Init); } @@ -646,10 +641,6 @@ impl EventLoop { } } - fn set_control_flow(&self, control_flow: ControlFlow) { - self.target.p.set_control_flow(control_flow) - } - fn control_flow(&self) -> ControlFlow { self.target.p.control_flow() } diff --git a/src/platform_impl/macos/app_state.rs b/src/platform_impl/macos/app_state.rs index 046043d0..a18ffebd 100644 --- a/src/platform_impl/macos/app_state.rs +++ b/src/platform_impl/macos/app_state.rs @@ -199,7 +199,6 @@ impl Handler { // looks like there have been recuring re-entrancy issues with callback handling that might // make that awkward) self.running.store(false, Ordering::Relaxed); - *self.control_flow.lock().unwrap() = ControlFlow::default(); self.set_stop_app_on_redraw_requested(false); self.set_stop_app_before_wait(false); self.set_stop_app_after_wait(false); diff --git a/src/platform_impl/windows/event_loop/runner.rs b/src/platform_impl/windows/event_loop/runner.rs index 00e60910..bb5eb56a 100644 --- a/src/platform_impl/windows/event_loop/runner.rs +++ b/src/platform_impl/windows/event_loop/runner.rs @@ -115,7 +115,7 @@ impl EventLoopRunner { interrupt_msg_dispatch, runner_state, panic_error, - control_flow, + control_flow: _, exit, last_events_cleared: _, event_handler, @@ -124,7 +124,6 @@ impl EventLoopRunner { interrupt_msg_dispatch.set(false); runner_state.set(RunnerState::Uninitialized); panic_error.set(None); - control_flow.set(ControlFlow::default()); exit.set(None); event_handler.set(None); } diff --git a/src/window.rs b/src/window.rs index 794d9e6c..59cd9985 100644 --- a/src/window.rs +++ b/src/window.rs @@ -45,6 +45,7 @@ pub use raw_window_handle; /// }; /// /// let mut event_loop = EventLoop::new().unwrap(); +/// event_loop.set_control_flow(ControlFlow::Wait); /// let window = Window::new(&event_loop).unwrap(); /// /// event_loop.run(move |event, elwt| {