diff --git a/include/sway/scene_descriptor.h b/include/sway/scene_descriptor.h new file mode 100644 index 000000000..a37633cc8 --- /dev/null +++ b/include/sway/scene_descriptor.h @@ -0,0 +1,19 @@ +#ifndef _SWAY_SCENE_DESCRIPTOR_H +#define _SWAY_SCENE_DESCRIPTOR_H +#include + +enum sway_scene_descriptor_type { +}; + +struct sway_scene_descriptor { + struct wlr_scene_node *node; + enum sway_scene_descriptor_type type; + void *data; + + struct wl_listener destroy; +}; + +void scene_descriptor_assign(struct wlr_scene_node *node, + enum sway_scene_descriptor_type type, void *data); + +#endif diff --git a/sway/meson.build b/sway/meson.build index 4d7dccfa8..206bd638e 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -8,6 +8,7 @@ sway_sources = files( 'lock.c', 'main.c', 'realtime.c', + 'scene_descriptor.c', 'server.c', 'swaynag.c', 'xdg_activation_v1.c', diff --git a/sway/scene_descriptor.c b/sway/scene_descriptor.c new file mode 100644 index 000000000..18710dbd7 --- /dev/null +++ b/sway/scene_descriptor.c @@ -0,0 +1,33 @@ +#include +#include "log.h" +#include "sway/scene_descriptor.h" + +static void handle_destroy(struct wl_listener *listener, void *data) { + struct sway_scene_descriptor *desc = + wl_container_of(listener, desc, destroy); + + desc->node->data = NULL; + wl_list_remove(&desc->destroy.link); + + free(desc); +} + +void scene_descriptor_assign(struct wlr_scene_node *node, + enum sway_scene_descriptor_type type, void *data) { + struct sway_scene_descriptor *desc = + calloc(1, sizeof(struct sway_scene_descriptor)); + + if (!desc) { + sway_log(SWAY_ERROR, "Could not allocate a scene descriptor"); + return; + } + + desc->type = type; + desc->data = data; + desc->node = node; + + desc->destroy.notify = handle_destroy; + wl_signal_add(&node->events.destroy, &desc->destroy); + + node->data = desc; +}