xwayland: Return NULL from xwl_window_buffer_get_available

If there's no available window buffer.

This allows keeping xwl_window_buffer->damage_region empty for a newly
allocated xwl_window_buffer in xwl_window_buffers_get_pixmap, instead
of first populating it in xwl_window_buffer_add_damage_region and then
emptying it again.
This commit is contained in:
Michel Dänzer 2024-01-09 17:10:23 +01:00 committed by Michel Dänzer
parent 6779ec5bf6
commit 777c3e0000

View File

@ -140,7 +140,7 @@ static struct xwl_window_buffer *
xwl_window_buffer_get_available(struct xwl_window *xwl_window) xwl_window_buffer_get_available(struct xwl_window *xwl_window)
{ {
if (xorg_list_is_empty(&xwl_window->window_buffers_available)) if (xorg_list_is_empty(&xwl_window->window_buffers_available))
return xwl_window_buffer_new(xwl_window); return NULL;
return xorg_list_last_entry(&xwl_window->window_buffers_available, return xorg_list_last_entry(&xwl_window->window_buffers_available,
struct xwl_window_buffer, struct xwl_window_buffer,
@ -341,13 +341,10 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window,
return window_pixmap; return window_pixmap;
#endif /* XWL_HAS_GLAMOR */ #endif /* XWL_HAS_GLAMOR */
xwl_window_buffer = xwl_window_buffer_get_available(xwl_window);
if (!xwl_window_buffer)
return window_pixmap;
xwl_window_buffer_add_damage_region(xwl_window, damage_region); xwl_window_buffer_add_damage_region(xwl_window, damage_region);
if (xwl_window_buffer->pixmap) { xwl_window_buffer = xwl_window_buffer_get_available(xwl_window);
if (xwl_window_buffer) {
RegionPtr full_damage = xwl_window_buffer->damage_region; RegionPtr full_damage = xwl_window_buffer->damage_region;
BoxPtr pBox = RegionRects(full_damage); BoxPtr pBox = RegionRects(full_damage);
int nBox = RegionNumRects(full_damage); int nBox = RegionNumRects(full_damage);
@ -364,10 +361,16 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window,
pBox++; pBox++;
} }
RegionEmpty(xwl_window_buffer->damage_region);
} else { } else {
xwl_window_buffer = xwl_window_buffer_new(xwl_window);
new_window_pixmap = xwl_window_allocate_pixmap(xwl_window); new_window_pixmap = xwl_window_allocate_pixmap(xwl_window);
if (!new_window_pixmap) if (!new_window_pixmap) {
xwl_window_buffer_maybe_dispose(xwl_window_buffer);
return window_pixmap; return window_pixmap;
}
copy_pixmap_area(window_pixmap, copy_pixmap_area(window_pixmap,
new_window_pixmap, new_window_pixmap,
@ -376,7 +379,6 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window,
window_pixmap->drawable.height); window_pixmap->drawable.height);
} }
RegionEmpty(xwl_window_buffer->damage_region);
xwl_window_buffer->pixmap = window_pixmap; xwl_window_buffer->pixmap = window_pixmap;
/* Hold a reference on the buffer until it's released by the compositor */ /* Hold a reference on the buffer until it's released by the compositor */