diff --git a/include/wlr/types/wlr_output_damage.h b/include/wlr/types/wlr_output_damage.h index beba2f6c..a4333c1a 100644 --- a/include/wlr/types/wlr_output_damage.h +++ b/include/wlr/types/wlr_output_damage.h @@ -23,6 +23,7 @@ */ struct wlr_output_damage { struct wlr_output *output; + int max_rects; // max number of damaged rectangles pixman_region32_t current; // in output-local coordinates diff --git a/types/wlr_output_damage.c b/types/wlr_output_damage.c index b3636c37..bf3a671d 100644 --- a/types/wlr_output_damage.c +++ b/types/wlr_output_damage.c @@ -58,6 +58,7 @@ struct wlr_output_damage *wlr_output_damage_create(struct wlr_output *output) { } output_damage->output = output; + output_damage->max_rects = 20; wl_signal_init(&output_damage->events.frame); wl_signal_init(&output_damage->events.destroy); @@ -125,6 +126,14 @@ bool wlr_output_damage_make_current(struct wlr_output_damage *output_damage, int j = (idx + i) % WLR_OUTPUT_DAMAGE_PREVIOUS_LEN; pixman_region32_union(damage, damage, &output_damage->previous[j]); } + + // Check the number of rectangles + int n_rects = pixman_region32_n_rects(damage); + if (n_rects > output_damage->max_rects) { + pixman_box32_t *extents = pixman_region32_extents(damage); + pixman_region32_union_rect(damage, damage, extents->x1, extents->y1, + extents->x2 - extents->x1, extents->y2 - extents->y1); + } } *needs_swap = output->needs_swap || pixman_region32_not_empty(damage);