From 8eb7ec53d4333369e491d723840ca63e1351d1f2 Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Sun, 7 Aug 2022 20:13:30 -0400 Subject: [PATCH] scene_graph: Introduce sway_scene_descriptor Across a wayland compositor, there are multiple shells: It can be a toplevel, or a layer_shell, or even something more meta like a drag icon or highlight indicators when dragging windows around. This object lets us store values that represent these modes of operation and keep track of what object is being represented. --- include/sway/scene_descriptor.h | 19 +++++++++++++++++++ sway/meson.build | 1 + sway/scene_descriptor.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 include/sway/scene_descriptor.h create mode 100644 sway/scene_descriptor.c 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; +}