From 4e2ce83d58ce1eb4bc7c4c1df24aa5c6435c2dac Mon Sep 17 00:00:00 2001 From: rustbasic <127506429+rustbasic@users.noreply.github.com> Date: Mon, 17 Feb 2025 17:57:09 +0900 Subject: [PATCH 1/2] Update run.rs --- crates/eframe/src/native/run.rs | 84 +++++++++++++++++---------------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/crates/eframe/src/native/run.rs b/crates/eframe/src/native/run.rs index fb02ac43999..37965b54ea2 100644 --- a/crates/eframe/src/native/run.rs +++ b/crates/eframe/src/native/run.rs @@ -88,53 +88,57 @@ impl WinitAppWrapper { event_loop: &ActiveEventLoop, event_result: Result, ) { + let mut now = Instant::now(); let mut exit = false; let mut save = false; log::trace!("event_result: {event_result:?}"); - let combined_result = event_result.and_then(|event_result| { - match event_result { - EventResult::Wait => { - event_loop.set_control_flow(ControlFlow::Wait); - Ok(event_result) - } - EventResult::RepaintNow(window_id) => { - log::trace!("RepaintNow of {window_id:?}",); + let mut event_result = event_result; - if cfg!(target_os = "windows") { - // Fix flickering on Windows, see https://github.com/emilk/egui/pull/2280 - self.winit_app.run_ui_and_paint(event_loop, window_id) - } else { - // Fix for https://github.com/emilk/egui/issues/2425 - self.windows_next_repaint_times - .insert(window_id, Instant::now()); - Ok(event_result) - } - } - EventResult::RepaintNext(window_id) => { - log::trace!("RepaintNext of {window_id:?}",); + if cfg!(target_os = "windows") { + if let Ok(EventResult::RepaintNow(window_id)) = event_result { + log::trace!("RepaintNow of {window_id:?}"); + self.windows_next_repaint_times.insert(window_id, now); + + // Fix flickering on Windows, see https://github.com/emilk/egui/pull/2280 + event_result = self.winit_app.run_ui_and_paint(event_loop, window_id); + + now = Instant::now(); + } + } + + let combined_result = event_result.map(|event_result| match event_result { + EventResult::Wait => { + event_loop.set_control_flow(ControlFlow::Wait); + event_result + } + EventResult::RepaintNow(window_id) => { + log::trace!("RepaintNow of {window_id:?}",); + self.windows_next_repaint_times.insert(window_id, now); + event_result + } + EventResult::RepaintNext(window_id) => { + log::trace!("RepaintNext of {window_id:?}",); + self.windows_next_repaint_times.insert(window_id, now); + event_result + } + EventResult::RepaintAt(window_id, repaint_time) => { + self.windows_next_repaint_times.insert( + window_id, self.windows_next_repaint_times - .insert(window_id, Instant::now()); - Ok(event_result) - } - EventResult::RepaintAt(window_id, repaint_time) => { - self.windows_next_repaint_times.insert( - window_id, - self.windows_next_repaint_times - .get(&window_id) - .map_or(repaint_time, |last| (*last).min(repaint_time)), - ); - Ok(event_result) - } - EventResult::Save => { - save = true; - Ok(event_result) - } - EventResult::Exit => { - exit = true; - Ok(event_result) - } + .get(&window_id) + .map_or(repaint_time, |last| (*last).min(repaint_time)), + ); + event_result + } + EventResult::Save => { + save = true; + event_result + } + EventResult::Exit => { + exit = true; + event_result } }); From c5d2575c84f073fbf926837a4c94fc1d12c4d653 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 21 Mar 2025 13:55:16 +0100 Subject: [PATCH 2/2] Remove `mut now` --- crates/eframe/src/native/run.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/eframe/src/native/run.rs b/crates/eframe/src/native/run.rs index 37965b54ea2..641459b5207 100644 --- a/crates/eframe/src/native/run.rs +++ b/crates/eframe/src/native/run.rs @@ -88,7 +88,6 @@ impl WinitAppWrapper { event_loop: &ActiveEventLoop, event_result: Result, ) { - let mut now = Instant::now(); let mut exit = false; let mut save = false; @@ -99,12 +98,11 @@ impl WinitAppWrapper { if cfg!(target_os = "windows") { if let Ok(EventResult::RepaintNow(window_id)) = event_result { log::trace!("RepaintNow of {window_id:?}"); - self.windows_next_repaint_times.insert(window_id, now); + self.windows_next_repaint_times + .insert(window_id, Instant::now()); // Fix flickering on Windows, see https://github.com/emilk/egui/pull/2280 event_result = self.winit_app.run_ui_and_paint(event_loop, window_id); - - now = Instant::now(); } } @@ -115,12 +113,14 @@ impl WinitAppWrapper { } EventResult::RepaintNow(window_id) => { log::trace!("RepaintNow of {window_id:?}",); - self.windows_next_repaint_times.insert(window_id, now); + self.windows_next_repaint_times + .insert(window_id, Instant::now()); event_result } EventResult::RepaintNext(window_id) => { log::trace!("RepaintNext of {window_id:?}",); - self.windows_next_repaint_times.insert(window_id, now); + self.windows_next_repaint_times + .insert(window_id, Instant::now()); event_result } EventResult::RepaintAt(window_id, repaint_time) => {