diff --git a/sway/desktop/output.c b/sway/desktop/output.c index d7d3fc07..54b9f294 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -473,6 +473,17 @@ void output_damage_box(struct sway_output *output, struct wlr_box *_box) { wlr_output_damage_add_box(output->damage, &box); } +static void damage_child_views_iterator(struct sway_container *con, + void *data) { + if (!con->view || !view_is_visible(con->view)) { + return; + } + struct sway_output *output = data; + bool whole = true; + output_view_for_each_surface(output, con->view, damage_surface_iterator, + &whole); +} + void output_damage_whole_container(struct sway_output *output, struct sway_container *con) { // Pad the box by 1px, because the width is a double and might be a fraction @@ -484,6 +495,12 @@ void output_damage_whole_container(struct sway_output *output, }; scale_box(&box, output->wlr_output->scale); wlr_output_damage_add_box(output->damage, &box); + // Damage subsurfaces as well, which may extend outside the box + if (con->view) { + damage_child_views_iterator(con, output); + } else { + container_for_each_child(con, damage_child_views_iterator, output); + } } static void damage_handle_destroy(struct wl_listener *listener, void *data) {