Only request synchronous repaint when a resize will actually occur.

This commit is contained in:
Josh Matthews 2021-03-03 09:36:11 -05:00
parent 10231573be
commit 49ddc5ea3d
3 changed files with 12 additions and 14 deletions

View file

@ -835,7 +835,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
}
}
pub fn on_resize_window_event(&mut self) {
pub fn on_resize_window_event(&mut self) -> bool {
debug!("compositor resize requested");
let old_coords = self.embedder_coordinates;
@ -847,11 +847,12 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
}
if self.embedder_coordinates.viewport == old_coords.viewport {
return;
return false;
}
self.send_window_size(WindowSizeType::Resize);
self.composite_if_necessary(CompositingReason::Resize);
return true;
}
pub fn on_mouse_window_event_class(&mut self, mouse_window_event: MouseWindowEvent) {

View file

@ -549,7 +549,7 @@ where
}
}
fn handle_window_event(&mut self, event: WindowEvent) {
fn handle_window_event(&mut self, event: WindowEvent) -> bool {
match event {
WindowEvent::Idle => {},
@ -558,7 +558,7 @@ where
},
WindowEvent::Resize => {
self.compositor.on_resize_window_event();
return self.compositor.on_resize_window_event();
},
WindowEvent::AllowNavigationResponse(pipeline_id, allowed) => {
@ -745,6 +745,7 @@ where
}
},
}
return false;
}
fn receive_messages(&mut self) {
@ -776,18 +777,20 @@ where
::std::mem::replace(&mut self.embedder_events, Vec::new())
}
pub fn handle_events(&mut self, events: Vec<WindowEvent>) {
pub fn handle_events(&mut self, events: Vec<WindowEvent>) -> bool {
if self.compositor.receive_messages() {
self.receive_messages();
}
let mut need_resize = false;
for event in events {
self.handle_window_event(event);
need_resize |= self.handle_window_event(event);
}
if self.compositor.shutdown_state != ShutdownState::FinishedShuttingDown {
self.compositor.perform_updates();
} else {
self.embedder_events.push((None, EmbedderMsg::Shutdown));
}
need_resize
}
pub fn repaint_synchronously(&mut self) {

View file

@ -204,19 +204,13 @@ impl App {
}
});
// FIXME: this could be handled by Servo. We don't need
// a repaint_synchronously function exposed.
let need_resize = app_events.iter().any(|e| match *e {
WindowEvent::Resize => true,
_ => false,
});
browser.handle_window_events(app_events);
let mut servo_events = self.servo.as_mut().unwrap().get_events();
let mut need_resize = false;
loop {
browser.handle_servo_events(servo_events);
self.servo.as_mut().unwrap().handle_events(browser.get_events());
need_resize |= self.servo.as_mut().unwrap().handle_events(browser.get_events());
if browser.shutdown_requested() {
return true;
}