aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/wlr/types/wlr_scene.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/include/wlr/types/wlr_scene.h b/include/wlr/types/wlr_scene.h
new file mode 100644
index 00000000..953b1b87
--- /dev/null
+++ b/include/wlr/types/wlr_scene.h
@@ -0,0 +1,114 @@
+/*
+ * This an unstable interface of wlroots. No guarantees are made regarding the
+ * future consistency of this API.
+ */
+#ifndef WLR_USE_UNSTABLE
+#error "Add -DWLR_USE_UNSTABLE to enable unstable wlroots features"
+#endif
+
+#ifndef WLR_TYPES_WLR_SCENE_H
+#define WLR_TYPES_WLR_SCENE_H
+
+/**
+ * The scene-graph API provides a declarative way to display surfaces. The
+ * compositor creates a scene, adds surfaces, then renders the scene on
+ * outputs.
+ *
+ * The scene-graph API only supports basic 2D composition operations (like the
+ * KMS API or the Wayland protocol does). For anything more complicated,
+ * compositors need to implement custom rendering logic.
+ */
+
+#include <pixman.h>
+#include <wayland-server-core.h>
+#include <wlr/types/wlr_surface.h>
+
+struct wlr_output;
+
+enum wlr_scene_node_type {
+ WLR_SCENE_NODE_ROOT,
+ WLR_SCENE_NODE_SURFACE,
+};
+
+struct wlr_scene_node_state {
+ struct wl_list link; // wlr_scene_node_state.children
+
+ struct wl_list children; // wlr_scene_node_state.link
+
+ int x, y; // relative to parent
+};
+
+/** A node is an object in the scene. */
+struct wlr_scene_node {
+ enum wlr_scene_node_type type;
+ struct wlr_scene_node *parent;
+ struct wlr_scene_node_state state;
+
+ struct {
+ struct wl_signal destroy;
+ } events;
+};
+
+/** The root scene-graph node. */
+struct wlr_scene {
+ struct wlr_scene_node node;
+};
+
+/** A scene-graph node displaying a single surface. */
+struct wlr_scene_surface {
+ struct wlr_scene_node node;
+ struct wlr_surface *surface;
+
+ // private state
+
+ struct wl_listener surface_destroy;
+};
+
+/**
+ * Immediately destroy the scene-graph node.
+ */
+void wlr_scene_node_destroy(struct wlr_scene_node *node);
+/**
+ * Set the position of the node relative to its parent.
+ */
+void wlr_scene_node_set_position(struct wlr_scene_node *node, int x, int y);
+/**
+ * Move the node right above the specified sibling.
+ */
+void wlr_scene_node_place_above(struct wlr_scene_node *node,
+ struct wlr_scene_node *sibling);
+/**
+ * Move the node right below the specified sibling.
+ */
+void wlr_scene_node_place_below(struct wlr_scene_node *node,
+ struct wlr_scene_node *sibling);
+/**
+ * Call `iterator` on each surface in the scene-graph, with the surface's
+ * position in layout coordinates. The function is called from root to leaves
+ * (in rendering order).
+ */
+void wlr_scene_node_for_each_surface(struct wlr_scene_node *node,
+ wlr_surface_iterator_func_t iterator, void *user_data);
+
+/**
+ * Create a new scene-graph.
+ */
+struct wlr_scene *wlr_scene_create(void);
+/**
+ * Manually render the scene-graph on an output. The compositor needs to call
+ * wlr_renderer_begin before and wlr_renderer_end after calling this function.
+ * Damage is given in output-buffer-local coordinates and can be set to NULL to
+ * disable damage tracking.
+ */
+void wlr_scene_render_output(struct wlr_scene *scene, struct wlr_output *output,
+ int lx, int ly, pixman_region32_t *damage);
+
+/**
+ * Add a node displaying a single surface to the scene-graph.
+ *
+ * The child sub-surfaces are ignored.
+ */
+struct wlr_scene_surface *wlr_scene_surface_create(struct wlr_scene_node *parent,
+ struct wlr_surface *surface);
+
+#endif