diff --git a/include/wlr/types/wlr_buffer.h b/include/wlr/types/wlr_buffer.h index 14bb2a8d..84555899 100644 --- a/include/wlr/types/wlr_buffer.h +++ b/include/wlr/types/wlr_buffer.h @@ -103,6 +103,11 @@ struct wlr_client_buffer { struct wlr_renderer; +/** + * Get a client buffer from a generic buffer. If the buffer isn't a client + * buffer, returns NULL. + */ +struct wlr_client_buffer *wlr_client_buffer_get(struct wlr_buffer *buffer); /** * Check if a resource is a wl_buffer resource. */ diff --git a/types/wlr_buffer.c b/types/wlr_buffer.c index 2f914c12..29b26412 100644 --- a/types/wlr_buffer.c +++ b/types/wlr_buffer.c @@ -96,10 +96,18 @@ bool wlr_resource_get_buffer_size(struct wl_resource *resource, static const struct wlr_buffer_impl client_buffer_impl; +struct wlr_client_buffer *wlr_client_buffer_get(struct wlr_buffer *buffer) { + if (buffer->impl != &client_buffer_impl) { + return NULL; + } + return (struct wlr_client_buffer *)buffer; +} + static struct wlr_client_buffer *client_buffer_from_buffer( struct wlr_buffer *buffer) { - assert(buffer->impl == &client_buffer_impl); - return (struct wlr_client_buffer *) buffer; + struct wlr_client_buffer *client_buffer = wlr_client_buffer_get(buffer); + assert(client_buffer != NULL); + return client_buffer; } static void client_buffer_destroy(struct wlr_buffer *_buffer) {