wvr_server: drain redraw requests

This commit is contained in:
galister 2026-07-04 21:04:20 +09:00
parent 074787d18e
commit 82a8e801c2
2 changed files with 31 additions and 28 deletions

View File

@ -153,12 +153,20 @@ impl Application {
pub fn has_pending_frame_callbacks(
&self,
surface_id: wayland_server::backend::ObjectId,
surface_id: &wayland_server::backend::ObjectId,
) -> bool {
self.pending_frame_callbacks
.get(&surface_id)
.get(surface_id)
.is_some_and(|v| !v.is_empty())
}
pub fn take_redraw_request(&mut self, surface_id: &ObjectId) -> bool {
self.redraw_requests.remove(surface_id)
}
pub fn has_redraw_request(&self, surface_id: &ObjectId) -> bool {
self.redraw_requests.contains(surface_id)
}
}
impl compositor::CompositorHandler for Application {

View File

@ -470,35 +470,10 @@ impl OverlayBackend for WvrWindowBackend {
return Ok(ShouldRender::Unable);
};
let surface_id = toplevel.wl_surface().id();
let surfaces = collect_rendered_surface_tree(toplevel.wl_surface());
let has_pending_callbacks = surfaces.iter().any(|s| {
app.wvr_server
.as_ref()
.unwrap()
.manager
.state
.has_pending_frame_callbacks(s.surface_id.clone())
});
let subtree_dirty = rendered_surfaces_dirty(&self.surfaces, &surfaces)
|| surfaces.iter().any(|s| {
app.wvr_server
.as_ref()
.unwrap()
.manager
.state
.redraw_requests
.contains(&s.surface_id)
});
self.surfaces = surfaces;
let should_render_panel = self.panel.should_render(app)?;
let force_render =
has_pending_callbacks || subtree_dirty || mem::take(&mut self.just_resumed);
let popups = PopupManager::popups_for_surface(toplevel.wl_surface())
.filter_map(|(popup, point)| {
with_states(popup.wl_surface(), |states| {
@ -533,6 +508,26 @@ impl OverlayBackend for WvrWindowBackend {
})
.collect::<Vec<_>>();
let mut tree_dirty = false;
if let Some(wvr_server) = app.wvr_server.as_mut() {
let state = &mut wvr_server.manager.state;
tree_dirty |= state.take_redraw_request(&surface_id);
tree_dirty |= state.has_pending_frame_callbacks(&surface_id);
for surface in &surfaces {
tree_dirty |= state.take_redraw_request(&surface.surface_id);
tree_dirty |= state.has_pending_frame_callbacks(&surface.surface_id);
}
for popup in &popups {
tree_dirty |= state.take_redraw_request(&popup.surface_id);
tree_dirty |= state.has_pending_frame_callbacks(&popup.surface_id);
}
}
self.surfaces = surfaces;
let force_render = tree_dirty || mem::take(&mut self.just_resumed);
with_states(toplevel.wl_surface(), |states| {
if let Some(surf) = SurfaceBufWithImage::get_from_surface(states) {
let mut meta = FrameMeta {