mirror of
https://github.com/emilk/egui.git
synced 2026-08-29 12:50:04 -04:00
egui-winit: don't repaint when just moving window (#1980)
* Bug fix: reset repaint countdown when we pass it * eframe: debug-print what winit event caused a repaint * egui-winit: don't repaint when only moving window * fix docstring
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
use crate::{epi, Theme, WindowInfo};
|
||||
use egui_winit::{native_pixels_per_point, WindowSettings};
|
||||
use winit::event_loop::EventLoopWindowTarget;
|
||||
|
||||
use egui_winit::{native_pixels_per_point, EventResponse, WindowSettings};
|
||||
|
||||
use crate::{epi, Theme, WindowInfo};
|
||||
|
||||
pub fn points_to_size(points: egui::Vec2) -> winit::dpi::LogicalSize<f64> {
|
||||
winit::dpi::LogicalSize {
|
||||
width: points.x as f64,
|
||||
@@ -248,7 +250,11 @@ impl EpiIntegration {
|
||||
self.close
|
||||
}
|
||||
|
||||
pub fn on_event(&mut self, app: &mut dyn epi::App, event: &winit::event::WindowEvent<'_>) {
|
||||
pub fn on_event(
|
||||
&mut self,
|
||||
app: &mut dyn epi::App,
|
||||
event: &winit::event::WindowEvent<'_>,
|
||||
) -> EventResponse {
|
||||
use winit::event::{ElementState, MouseButton, WindowEvent};
|
||||
|
||||
match event {
|
||||
@@ -262,7 +268,7 @@ impl EpiIntegration {
|
||||
_ => {}
|
||||
}
|
||||
|
||||
self.egui_winit.on_event(&self.egui_ctx, event);
|
||||
self.egui_winit.on_event(&self.egui_ctx, event)
|
||||
}
|
||||
|
||||
pub fn update(
|
||||
|
||||
@@ -19,6 +19,7 @@ pub struct RequestRepaintEvent;
|
||||
|
||||
pub use epi::NativeOptions;
|
||||
|
||||
#[derive(Debug)]
|
||||
enum EventResult {
|
||||
Wait,
|
||||
RepaintAsap,
|
||||
@@ -35,7 +36,7 @@ trait WinitApp {
|
||||
fn on_event(
|
||||
&mut self,
|
||||
event_loop: &EventLoopWindowTarget<RequestRepaintEvent>,
|
||||
event: winit::event::Event<'_, RequestRepaintEvent>,
|
||||
event: &winit::event::Event<'_, RequestRepaintEvent>,
|
||||
) -> EventResult;
|
||||
}
|
||||
|
||||
@@ -81,7 +82,7 @@ fn run_and_return(event_loop: &mut EventLoop<RequestRepaintEvent>, mut winit_app
|
||||
let mut next_repaint_time = Instant::now();
|
||||
|
||||
event_loop.run_return(|event, event_loop, control_flow| {
|
||||
let event_result = match event {
|
||||
let event_result = match &event {
|
||||
winit::event::Event::LoopDestroyed => EventResult::Exit,
|
||||
|
||||
// Platform-dependent event handlers to workaround a winit bug
|
||||
@@ -103,7 +104,7 @@ fn run_and_return(event_loop: &mut EventLoop<RequestRepaintEvent>, mut winit_app
|
||||
|
||||
winit::event::Event::WindowEvent { window_id, .. }
|
||||
if winit_app.window().is_none()
|
||||
|| window_id != winit_app.window().unwrap().id() =>
|
||||
|| *window_id != winit_app.window().unwrap().id() =>
|
||||
{
|
||||
// This can happen if we close a window, and then reopen a new one,
|
||||
// or if we have multiple windows open.
|
||||
@@ -116,6 +117,7 @@ fn run_and_return(event_loop: &mut EventLoop<RequestRepaintEvent>, mut winit_app
|
||||
match event_result {
|
||||
EventResult::Wait => {}
|
||||
EventResult::RepaintAsap => {
|
||||
tracing::debug!("Repaint caused by winit::Event: {:?}", event);
|
||||
next_repaint_time = Instant::now();
|
||||
}
|
||||
EventResult::RepaintAt(repaint_time) => {
|
||||
@@ -132,6 +134,7 @@ fn run_and_return(event_loop: &mut EventLoop<RequestRepaintEvent>, mut winit_app
|
||||
if let Some(window) = winit_app.window() {
|
||||
window.request_redraw();
|
||||
}
|
||||
next_repaint_time = Instant::now() + Duration::from_secs(1_000_000_000);
|
||||
ControlFlow::Poll
|
||||
}
|
||||
Some(time_until_next_repaint) => {
|
||||
@@ -181,7 +184,7 @@ fn run_and_exit(
|
||||
..
|
||||
}) => EventResult::RepaintAsap,
|
||||
|
||||
event => winit_app.on_event(event_loop, event),
|
||||
event => winit_app.on_event(event_loop, &event),
|
||||
};
|
||||
|
||||
match event_result {
|
||||
@@ -496,7 +499,7 @@ mod glow_integration {
|
||||
fn on_event(
|
||||
&mut self,
|
||||
event_loop: &EventLoopWindowTarget<RequestRepaintEvent>,
|
||||
event: winit::event::Event<'_, RequestRepaintEvent>,
|
||||
event: &winit::event::Event<'_, RequestRepaintEvent>,
|
||||
) -> EventResult {
|
||||
match event {
|
||||
winit::event::Event::Resumed => {
|
||||
@@ -551,13 +554,15 @@ mod glow_integration {
|
||||
_ => {}
|
||||
}
|
||||
|
||||
running.integration.on_event(running.app.as_mut(), &event);
|
||||
let event_response =
|
||||
running.integration.on_event(running.app.as_mut(), event);
|
||||
|
||||
if running.integration.should_close() {
|
||||
EventResult::Exit
|
||||
} else {
|
||||
// TODO(emilk): ask egui if the event warrants a repaint
|
||||
} else if event_response.repaint {
|
||||
EventResult::RepaintAsap
|
||||
} else {
|
||||
EventResult::Wait
|
||||
}
|
||||
} else {
|
||||
EventResult::Wait
|
||||
@@ -847,7 +852,7 @@ mod wgpu_integration {
|
||||
fn on_event(
|
||||
&mut self,
|
||||
event_loop: &EventLoopWindowTarget<RequestRepaintEvent>,
|
||||
event: winit::event::Event<'_, RequestRepaintEvent>,
|
||||
event: &winit::event::Event<'_, RequestRepaintEvent>,
|
||||
) -> EventResult {
|
||||
match event {
|
||||
winit::event::Event::Resumed => {
|
||||
@@ -912,12 +917,14 @@ mod wgpu_integration {
|
||||
_ => {}
|
||||
};
|
||||
|
||||
running.integration.on_event(running.app.as_mut(), &event);
|
||||
let event_response =
|
||||
running.integration.on_event(running.app.as_mut(), event);
|
||||
if running.integration.should_close() {
|
||||
EventResult::Exit
|
||||
} else {
|
||||
// TODO(emilk): ask egui if the event warrants a repaint
|
||||
} else if event_response.repaint {
|
||||
EventResult::RepaintAsap
|
||||
} else {
|
||||
EventResult::Wait
|
||||
}
|
||||
} else {
|
||||
EventResult::Wait
|
||||
|
||||
Reference in New Issue
Block a user