From d9f6ec080fd21adab4318899ed1c89fb7cc3a709 Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Fri, 21 Apr 2023 20:56:23 +0200 Subject: [PATCH] wlr_buffer: Introduce prerelease The prerelease signal lets users do things things at the last moment that would be inappropriate to do on the release signal. Inside the prerelease signal, it is allowed to lock the buffer and also upload/import the contents of the buffer to a texture. --- include/wlr/types/wlr_buffer.h | 1 + types/buffer/buffer.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/include/wlr/types/wlr_buffer.h b/include/wlr/types/wlr_buffer.h index 9a655dd2b..91543b5ea 100644 --- a/include/wlr/types/wlr_buffer.h +++ b/include/wlr/types/wlr_buffer.h @@ -56,6 +56,7 @@ struct wlr_buffer { struct { struct wl_signal destroy; struct wl_signal release; + struct wl_signal prerelease; } events; struct wlr_addon_set addons; diff --git a/types/buffer/buffer.c b/types/buffer/buffer.c index 953207a2c..ef744f1b5 100644 --- a/types/buffer/buffer.c +++ b/types/buffer/buffer.c @@ -19,6 +19,7 @@ void wlr_buffer_init(struct wlr_buffer *buffer, }; wl_signal_init(&buffer->events.destroy); wl_signal_init(&buffer->events.release); + wl_signal_init(&buffer->events.prerelease); wlr_addon_set_init(&buffer->addons); } @@ -58,6 +59,10 @@ void wlr_buffer_unlock(struct wlr_buffer *buffer) { assert(buffer->n_locks > 0); buffer->n_locks--; + if (buffer->n_locks == 0) { + wl_signal_emit_mutable(&buffer->events.prerelease, NULL); + } + if (buffer->n_locks == 0) { wl_signal_emit_mutable(&buffer->events.release, NULL); }