diff options
Diffstat (limited to 'sway/scene_descriptor.c')
-rw-r--r-- | sway/scene_descriptor.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/sway/scene_descriptor.c b/sway/scene_descriptor.c new file mode 100644 index 00000000..a30d4664 --- /dev/null +++ b/sway/scene_descriptor.c | |||
@@ -0,0 +1,66 @@ | |||
1 | #include <stdlib.h> | ||
2 | #include <wlr/util/addon.h> | ||
3 | #include "log.h" | ||
4 | #include "sway/scene_descriptor.h" | ||
5 | |||
6 | struct scene_descriptor { | ||
7 | void *data; | ||
8 | struct wlr_addon addon; | ||
9 | }; | ||
10 | |||
11 | static const struct wlr_addon_interface addon_interface; | ||
12 | |||
13 | static struct scene_descriptor *scene_node_get_descriptor( | ||
14 | struct wlr_scene_node *node, enum sway_scene_descriptor_type type) { | ||
15 | struct wlr_addon *addon = wlr_addon_find(&node->addons, (void *)type, &addon_interface); | ||
16 | if (!addon) { | ||
17 | return NULL; | ||
18 | } | ||
19 | |||
20 | struct scene_descriptor *desc = wl_container_of(addon, desc, addon); | ||
21 | return desc; | ||
22 | } | ||
23 | |||
24 | static void descriptor_destroy(struct scene_descriptor *desc) { | ||
25 | wlr_addon_finish(&desc->addon); | ||
26 | free(desc); | ||
27 | } | ||
28 | |||
29 | void *scene_descriptor_try_get(struct wlr_scene_node *node, | ||
30 | enum sway_scene_descriptor_type type) { | ||
31 | struct scene_descriptor *desc = scene_node_get_descriptor(node, type); | ||
32 | if (!desc) { | ||
33 | return NULL; | ||
34 | } | ||
35 | |||
36 | return desc->data; | ||
37 | } | ||
38 | |||
39 | void scene_descriptor_destroy(struct wlr_scene_node *node, | ||
40 | enum sway_scene_descriptor_type type) { | ||
41 | struct scene_descriptor *desc = scene_node_get_descriptor(node, type); | ||
42 | descriptor_destroy(desc); | ||
43 | } | ||
44 | |||
45 | static void addon_handle_destroy(struct wlr_addon *addon) { | ||
46 | struct scene_descriptor *desc = wl_container_of(addon, desc, addon); | ||
47 | descriptor_destroy(desc); | ||
48 | } | ||
49 | |||
50 | static const struct wlr_addon_interface addon_interface = { | ||
51 | .name = "sway_scene_descriptor", | ||
52 | .destroy = addon_handle_destroy, | ||
53 | }; | ||
54 | |||
55 | bool scene_descriptor_assign(struct wlr_scene_node *node, | ||
56 | enum sway_scene_descriptor_type type, void *data) { | ||
57 | struct scene_descriptor *desc = calloc(1, sizeof(*desc)); | ||
58 | if (!desc) { | ||
59 | sway_log(SWAY_ERROR, "Could not allocate a scene descriptor"); | ||
60 | return false; | ||
61 | } | ||
62 | |||
63 | wlr_addon_init(&desc->addon, &node->addons, (void *)type, &addon_interface); | ||
64 | desc->data = data; | ||
65 | return true; | ||
66 | } | ||