mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-26 14:45:58 +01:00
scene: add wlr_scene_tree
This commit is contained in:
parent
ccc84f11a4
commit
211b3b760e
2 changed files with 34 additions and 2 deletions
|
@ -28,6 +28,7 @@ struct wlr_output_layout;
|
||||||
|
|
||||||
enum wlr_scene_node_type {
|
enum wlr_scene_node_type {
|
||||||
WLR_SCENE_NODE_ROOT,
|
WLR_SCENE_NODE_ROOT,
|
||||||
|
WLR_SCENE_NODE_TREE,
|
||||||
WLR_SCENE_NODE_SURFACE,
|
WLR_SCENE_NODE_SURFACE,
|
||||||
WLR_SCENE_NODE_RECT,
|
WLR_SCENE_NODE_RECT,
|
||||||
};
|
};
|
||||||
|
@ -61,6 +62,11 @@ struct wlr_scene {
|
||||||
struct wl_list outputs; // wlr_scene_output.link
|
struct wl_list outputs; // wlr_scene_output.link
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** A sub-tree in the scene-graph. */
|
||||||
|
struct wlr_scene_tree {
|
||||||
|
struct wlr_scene_node node;
|
||||||
|
};
|
||||||
|
|
||||||
/** A scene-graph node displaying a single surface. */
|
/** A scene-graph node displaying a single surface. */
|
||||||
struct wlr_scene_surface {
|
struct wlr_scene_surface {
|
||||||
struct wlr_scene_node node;
|
struct wlr_scene_node node;
|
||||||
|
@ -157,6 +163,11 @@ struct wlr_scene *wlr_scene_create(void);
|
||||||
void wlr_scene_render_output(struct wlr_scene *scene, struct wlr_output *output,
|
void wlr_scene_render_output(struct wlr_scene *scene, struct wlr_output *output,
|
||||||
int lx, int ly, pixman_region32_t *damage);
|
int lx, int ly, pixman_region32_t *damage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a node displaying nothing but its children.
|
||||||
|
*/
|
||||||
|
struct wlr_scene_tree *wlr_scene_tree_create(struct wlr_scene_node *parent);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a node displaying a single surface to the scene-graph.
|
* Add a node displaying a single surface to the scene-graph.
|
||||||
*
|
*
|
||||||
|
|
|
@ -15,6 +15,11 @@ static struct wlr_scene *scene_root_from_node(struct wlr_scene_node *node) {
|
||||||
return (struct wlr_scene *)node;
|
return (struct wlr_scene *)node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct wlr_scene_tree *scene_tree_from_node(struct wlr_scene_node *node) {
|
||||||
|
assert(node->type == WLR_SCENE_NODE_TREE);
|
||||||
|
return (struct wlr_scene_tree *)node;
|
||||||
|
}
|
||||||
|
|
||||||
struct wlr_scene_surface *wlr_scene_surface_from_node(
|
struct wlr_scene_surface *wlr_scene_surface_from_node(
|
||||||
struct wlr_scene_node *node) {
|
struct wlr_scene_node *node) {
|
||||||
assert(node->type == WLR_SCENE_NODE_SURFACE);
|
assert(node->type == WLR_SCENE_NODE_SURFACE);
|
||||||
|
@ -84,6 +89,10 @@ void wlr_scene_node_destroy(struct wlr_scene_node *node) {
|
||||||
|
|
||||||
free(scene);
|
free(scene);
|
||||||
break;
|
break;
|
||||||
|
case WLR_SCENE_NODE_TREE:;
|
||||||
|
struct wlr_scene_tree *tree = scene_tree_from_node(node);
|
||||||
|
free(tree);
|
||||||
|
break;
|
||||||
case WLR_SCENE_NODE_SURFACE:;
|
case WLR_SCENE_NODE_SURFACE:;
|
||||||
struct wlr_scene_surface *scene_surface = wlr_scene_surface_from_node(node);
|
struct wlr_scene_surface *scene_surface = wlr_scene_surface_from_node(node);
|
||||||
wl_list_remove(&scene_surface->surface_destroy.link);
|
wl_list_remove(&scene_surface->surface_destroy.link);
|
||||||
|
@ -106,6 +115,16 @@ struct wlr_scene *wlr_scene_create(void) {
|
||||||
return scene;
|
return scene;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct wlr_scene_tree *wlr_scene_tree_create(struct wlr_scene_node *parent) {
|
||||||
|
struct wlr_scene_tree *tree = calloc(1, sizeof(struct wlr_scene_tree));
|
||||||
|
if (tree == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
scene_node_init(&tree->node, WLR_SCENE_NODE_TREE, parent);
|
||||||
|
|
||||||
|
return tree;
|
||||||
|
}
|
||||||
|
|
||||||
static void scene_surface_handle_surface_destroy(struct wl_listener *listener,
|
static void scene_surface_handle_surface_destroy(struct wl_listener *listener,
|
||||||
void *data) {
|
void *data) {
|
||||||
struct wlr_scene_surface *scene_surface =
|
struct wlr_scene_surface *scene_surface =
|
||||||
|
@ -246,6 +265,7 @@ static void _scene_node_damage_whole(struct wlr_scene_node *node,
|
||||||
int width = 0, height = 0;
|
int width = 0, height = 0;
|
||||||
switch (node->type) {
|
switch (node->type) {
|
||||||
case WLR_SCENE_NODE_ROOT:
|
case WLR_SCENE_NODE_ROOT:
|
||||||
|
case WLR_SCENE_NODE_TREE:
|
||||||
return;
|
return;
|
||||||
case WLR_SCENE_NODE_SURFACE:;
|
case WLR_SCENE_NODE_SURFACE:;
|
||||||
struct wlr_scene_surface *scene_surface =
|
struct wlr_scene_surface *scene_surface =
|
||||||
|
@ -536,8 +556,9 @@ static void render_node_iterator(struct wlr_scene_node *node,
|
||||||
};
|
};
|
||||||
|
|
||||||
switch (node->type) {
|
switch (node->type) {
|
||||||
case WLR_SCENE_NODE_ROOT:;
|
case WLR_SCENE_NODE_ROOT:
|
||||||
/* Root node has nothing to render itself */
|
case WLR_SCENE_NODE_TREE:
|
||||||
|
/* Root or tree node has nothing to render itself */
|
||||||
break;
|
break;
|
||||||
case WLR_SCENE_NODE_SURFACE:;
|
case WLR_SCENE_NODE_SURFACE:;
|
||||||
struct wlr_scene_surface *scene_surface = wlr_scene_surface_from_node(node);
|
struct wlr_scene_surface *scene_surface = wlr_scene_surface_from_node(node);
|
||||||
|
|
Loading…
Reference in a new issue