diff options
-rw-r--r-- | include/wlr/types/wlr_export_dmabuf_v1.h | 26 | ||||
-rw-r--r-- | types/wlr_export_dmabuf_v1.c | 11 |
2 files changed, 22 insertions, 15 deletions
diff --git a/include/wlr/types/wlr_export_dmabuf_v1.h b/include/wlr/types/wlr_export_dmabuf_v1.h index 8669574d..204da985 100644 --- a/include/wlr/types/wlr_export_dmabuf_v1.h +++ b/include/wlr/types/wlr_export_dmabuf_v1.h @@ -13,12 +13,22 @@ #include <wayland-server.h> #include <wlr/render/dmabuf.h> -struct wlr_export_dmabuf_manager_v1; +struct wlr_export_dmabuf_manager_v1 { + struct wl_global *global; + struct wl_list resources; // wl_resource_get_link + struct wl_list frames; // wlr_export_dmabuf_frame_v1::link + + struct wl_listener display_destroy; + + struct { + struct wl_signal destroy; + } events; +}; struct wlr_export_dmabuf_frame_v1 { struct wl_resource *resource; struct wlr_export_dmabuf_manager_v1 *manager; - struct wl_list link; + struct wl_list link; // wlr_export_dmabuf_manager_v1::frames struct wlr_dmabuf_attributes attribs; struct wlr_output *output; @@ -28,18 +38,6 @@ struct wlr_export_dmabuf_frame_v1 { struct wl_listener output_swap_buffers; }; -struct wlr_export_dmabuf_manager_v1 { - struct wl_global *global; - struct wl_list resources; - struct wl_list frames; - - struct wl_listener display_destroy; - - struct { - struct wl_signal destroy; - } events; -}; - struct wlr_export_dmabuf_manager_v1 *wlr_export_dmabuf_manager_v1_create( struct wl_display *display); void wlr_export_dmabuf_manager_v1_destroy( diff --git a/types/wlr_export_dmabuf_v1.c b/types/wlr_export_dmabuf_v1.c index 85ccf1eb..3af7e69f 100644 --- a/types/wlr_export_dmabuf_v1.c +++ b/types/wlr_export_dmabuf_v1.c @@ -5,8 +5,9 @@ #include <wlr/render/dmabuf.h> #include <wlr/types/wlr_export_dmabuf_v1.h> #include <wlr/types/wlr_output.h> -#include "wlr-export-dmabuf-unstable-v1-protocol.h" #include <wlr/util/log.h> +#include "util/signal.h" +#include "wlr-export-dmabuf-unstable-v1-protocol.h" #define EXPORT_DMABUF_MANAGER_VERSION 1 @@ -146,8 +147,14 @@ static void manager_handle_capture_output(struct wl_client *client, frame->output_swap_buffers.notify = frame_output_handle_swap_buffers; } +static void manager_handle_destroy(struct wl_client *client, + struct wl_resource *manager_resource) { + wl_resource_destroy(manager_resource); +} + static const struct zwlr_export_dmabuf_manager_v1_interface manager_impl = { .capture_output = manager_handle_capture_output, + .destroy = manager_handle_destroy, }; static void manager_handle_resource_destroy(struct wl_resource *resource) { @@ -185,6 +192,7 @@ struct wlr_export_dmabuf_manager_v1 *wlr_export_dmabuf_manager_v1_create( } wl_list_init(&manager->resources); wl_list_init(&manager->frames); + wl_signal_init(&manager->events.destroy); manager->global = wl_global_create(display, &zwlr_export_dmabuf_manager_v1_interface, EXPORT_DMABUF_MANAGER_VERSION, @@ -205,6 +213,7 @@ void wlr_export_dmabuf_manager_v1_destroy( if (manager == NULL) { return; } + wlr_signal_emit_safe(&manager->events.destroy, manager); wl_list_remove(&manager->display_destroy.link); wl_global_destroy(manager->global); struct wl_resource *resource, *resource_tmp; |