Avoid duplicated UserInterface::draw calls in RedrawRequested
This commit is contained in:
parent
58494bd033
commit
e772e5a9e9
1 changed files with 39 additions and 56 deletions
|
|
@ -312,13 +312,13 @@ async fn run_instance<A, E, C>(
|
||||||
|
|
||||||
while let Some(event) = event_receiver.next().await {
|
while let Some(event) = event_receiver.next().await {
|
||||||
match event {
|
match event {
|
||||||
event::Event::NewEvents(start_cause) => {
|
event::Event::NewEvents(
|
||||||
redraw_pending = matches!(
|
event::StartCause::Init
|
||||||
start_cause,
|
| event::StartCause::Poll
|
||||||
event::StartCause::Init
|
| event::StartCause::ResumeTimeReached { .. },
|
||||||
| event::StartCause::Poll
|
) if !redraw_pending => {
|
||||||
| event::StartCause::ResumeTimeReached { .. }
|
window.request_redraw();
|
||||||
);
|
redraw_pending = true;
|
||||||
}
|
}
|
||||||
event::Event::PlatformSpecific(event::PlatformSpecific::MacOS(
|
event::Event::PlatformSpecific(event::PlatformSpecific::MacOS(
|
||||||
event::MacOS::ReceivedUrl(url),
|
event::MacOS::ReceivedUrl(url),
|
||||||
|
|
@ -338,6 +338,33 @@ async fn run_instance<A, E, C>(
|
||||||
event: event::WindowEvent::RedrawRequested { .. },
|
event: event::WindowEvent::RedrawRequested { .. },
|
||||||
..
|
..
|
||||||
} => {
|
} => {
|
||||||
|
let physical_size = state.physical_size();
|
||||||
|
|
||||||
|
if physical_size.width == 0 || physical_size.height == 0 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let current_viewport_version = state.viewport_version();
|
||||||
|
|
||||||
|
if viewport_version != current_viewport_version {
|
||||||
|
let logical_size = state.logical_size();
|
||||||
|
|
||||||
|
debug.layout_started();
|
||||||
|
user_interface = ManuallyDrop::new(
|
||||||
|
ManuallyDrop::into_inner(user_interface)
|
||||||
|
.relayout(logical_size, &mut renderer),
|
||||||
|
);
|
||||||
|
debug.layout_finished();
|
||||||
|
|
||||||
|
compositor.configure_surface(
|
||||||
|
&mut surface,
|
||||||
|
physical_size.width,
|
||||||
|
physical_size.height,
|
||||||
|
);
|
||||||
|
|
||||||
|
viewport_version = current_viewport_version;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Avoid redrawing all the time by forcing widgets to
|
// TODO: Avoid redrawing all the time by forcing widgets to
|
||||||
// request redraws on state changes
|
// request redraws on state changes
|
||||||
//
|
//
|
||||||
|
|
@ -379,6 +406,7 @@ async fn run_instance<A, E, C>(
|
||||||
},
|
},
|
||||||
state.cursor(),
|
state.cursor(),
|
||||||
);
|
);
|
||||||
|
redraw_pending = false;
|
||||||
debug.draw_finished();
|
debug.draw_finished();
|
||||||
|
|
||||||
if new_mouse_interaction != mouse_interaction {
|
if new_mouse_interaction != mouse_interaction {
|
||||||
|
|
@ -389,53 +417,7 @@ async fn run_instance<A, E, C>(
|
||||||
mouse_interaction = new_mouse_interaction;
|
mouse_interaction = new_mouse_interaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
let physical_size = state.physical_size();
|
|
||||||
|
|
||||||
if physical_size.width == 0 || physical_size.height == 0 {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
debug.render_started();
|
debug.render_started();
|
||||||
let current_viewport_version = state.viewport_version();
|
|
||||||
|
|
||||||
if viewport_version != current_viewport_version {
|
|
||||||
let logical_size = state.logical_size();
|
|
||||||
|
|
||||||
debug.layout_started();
|
|
||||||
user_interface = ManuallyDrop::new(
|
|
||||||
ManuallyDrop::into_inner(user_interface)
|
|
||||||
.relayout(logical_size, &mut renderer),
|
|
||||||
);
|
|
||||||
debug.layout_finished();
|
|
||||||
|
|
||||||
debug.draw_started();
|
|
||||||
let new_mouse_interaction = user_interface.draw(
|
|
||||||
&mut renderer,
|
|
||||||
state.theme(),
|
|
||||||
&renderer::Style {
|
|
||||||
text_color: state.text_color(),
|
|
||||||
},
|
|
||||||
state.cursor(),
|
|
||||||
);
|
|
||||||
debug.draw_finished();
|
|
||||||
|
|
||||||
if new_mouse_interaction != mouse_interaction {
|
|
||||||
window.set_cursor_icon(conversion::mouse_interaction(
|
|
||||||
new_mouse_interaction,
|
|
||||||
));
|
|
||||||
|
|
||||||
mouse_interaction = new_mouse_interaction;
|
|
||||||
}
|
|
||||||
|
|
||||||
compositor.configure_surface(
|
|
||||||
&mut surface,
|
|
||||||
physical_size.width,
|
|
||||||
physical_size.height,
|
|
||||||
);
|
|
||||||
|
|
||||||
viewport_version = current_viewport_version;
|
|
||||||
}
|
|
||||||
|
|
||||||
match compositor.present(
|
match compositor.present(
|
||||||
&mut renderer,
|
&mut renderer,
|
||||||
&mut surface,
|
&mut surface,
|
||||||
|
|
@ -546,9 +528,10 @@ async fn run_instance<A, E, C>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
window.request_redraw();
|
if !redraw_pending {
|
||||||
|
window.request_redraw();
|
||||||
redraw_pending = false;
|
redraw_pending = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manually drop the user interface
|
// Manually drop the user interface
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue