1
0
Fork 0
forked from wry/wry

wl_surface: skip damage on null surfaces

This commit is contained in:
atagen 2026-04-07 09:35:31 +10:00
parent f94d6c644c
commit 4d803360dd

View file

@ -1443,12 +1443,21 @@ impl WlSurface {
self.commit_timeline.set_fifo_barrier(); self.commit_timeline.set_fifo_barrier();
} }
if damage_full && (self.visible.get() || was_visible) { if damage_full && (self.visible.get() || was_visible) {
let mut damage = // When a toplevel unmaps (null buffer commit), it transitions from visible to
buffer_abs_pos.with_size_saturating(max_surface_size.0, max_surface_size.1); // invisible here. Skip the immediate damage: the parent container or float node
if let Some(tl) = self.toplevel.get() { // already called damage() when removing the child, and for tiled windows the
damage = damage.intersect(tl.node_absolute_position()); // deferred layout damage system handles repainting once siblings have resized.
// Emitting damage here creates an intermediate frame showing an empty gap.
let becoming_invisible =
was_visible && !self.visible.get() && self.buffer.is_none();
if !becoming_invisible || self.toplevel.is_none() {
let mut damage =
buffer_abs_pos.with_size_saturating(max_surface_size.0, max_surface_size.1);
if let Some(tl) = self.toplevel.get() {
damage = damage.intersect(tl.node_absolute_position());
}
self.client.state.damage(damage);
} }
self.client.state.damage(damage);
} }
if self.visible.get() { if self.visible.get() {
let output = self.output.get(); let output = self.output.get();