aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Alexander Orzechowski <alex@ozal.ski>2023-11-21 19:05:37 -0500
committerLibravatar Kirill Primak <vyivel@eclair.cafe>2024-01-18 18:36:54 +0300
commit0e1a02bf0aad3d743985602b55043c5de019d1f0 (patch)
tree3dffc032ca7a56dc2d13a0350d33837de0e9f17d
parentscene_graph: Use built-in linux dmabuf feedback handling (diff)
downloadsway-0e1a02bf0aad3d743985602b55043c5de019d1f0.tar.gz
sway-0e1a02bf0aad3d743985602b55043c5de019d1f0.tar.zst
sway-0e1a02bf0aad3d743985602b55043c5de019d1f0.zip
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.
-rw-r--r--include/sway/scene_descriptor.h25
-rw-r--r--sway/meson.build1
-rw-r--r--sway/scene_descriptor.c66
3 files changed, 92 insertions, 0 deletions
diff --git a/include/sway/scene_descriptor.h b/include/sway/scene_descriptor.h
new file mode 100644
index 00000000..13ae81a3
--- /dev/null
+++ b/include/sway/scene_descriptor.h
@@ -0,0 +1,25 @@
1/**
2 * Across a wayland compositor, there are multiple shells: It can be
3 * a toplevel, or a layer_shell, or even something more meta like a drag
4 * icon or highlight indicators when dragging windows around.
5 *
6 * This object lets us store values that represent these modes of operation
7 * and keep track of what object is being represented.
8 */
9#ifndef _SWAY_SCENE_DESCRIPTOR_H
10#define _SWAY_SCENE_DESCRIPTOR_H
11#include <wlr/types/wlr_scene.h>
12
13enum sway_scene_descriptor_type {
14};
15
16bool scene_descriptor_assign(struct wlr_scene_node *node,
17 enum sway_scene_descriptor_type type, void *data);
18
19void *scene_descriptor_try_get(struct wlr_scene_node *node,
20 enum sway_scene_descriptor_type type);
21
22void scene_descriptor_destroy(struct wlr_scene_node *node,
23 enum sway_scene_descriptor_type type);
24
25#endif
diff --git a/sway/meson.build b/sway/meson.build
index 3abd778d..26251e58 100644
--- a/sway/meson.build
+++ b/sway/meson.build
@@ -8,6 +8,7 @@ sway_sources = files(
8 'lock.c', 8 'lock.c',
9 'main.c', 9 'main.c',
10 'realtime.c', 10 'realtime.c',
11 'scene_descriptor.c',
11 'server.c', 12 'server.c',
12 'swaynag.c', 13 'swaynag.c',
13 'xdg_activation_v1.c', 14 'xdg_activation_v1.c',
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
6struct scene_descriptor {
7 void *data;
8 struct wlr_addon addon;
9};
10
11static const struct wlr_addon_interface addon_interface;
12
13static 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
24static void descriptor_destroy(struct scene_descriptor *desc) {
25 wlr_addon_finish(&desc->addon);
26 free(desc);
27}
28
29void *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
39void 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
45static 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
50static const struct wlr_addon_interface addon_interface = {
51 .name = "sway_scene_descriptor",
52 .destroy = addon_handle_destroy,
53};
54
55bool 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}