mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-14 08:22:25 -04:00
wlr_scene: Introduce struct wlr_scene_subsurface_tree
This commit is contained in:
parent
a093049ec6
commit
1901c34e81
5 changed files with 33 additions and 15 deletions
|
|
@ -131,6 +131,10 @@ struct wlr_scene_surface {
|
|||
struct wl_listener surface_commit;
|
||||
};
|
||||
|
||||
struct wlr_scene_subsurface_tree {
|
||||
struct wlr_scene_tree *tree;
|
||||
};
|
||||
|
||||
/** A scene-graph node displaying a solid-colored rectangle */
|
||||
struct wlr_scene_rect {
|
||||
struct wlr_scene_node node;
|
||||
|
|
@ -547,7 +551,7 @@ void wlr_scene_output_layout_add_output(struct wlr_scene_output_layout *sol,
|
|||
* Add a node displaying a surface and all of its sub-surfaces to the
|
||||
* scene-graph.
|
||||
*/
|
||||
struct wlr_scene_tree *wlr_scene_subsurface_tree_create(
|
||||
struct wlr_scene_subsurface_tree *wlr_scene_subsurface_tree_create(
|
||||
struct wlr_scene_tree *parent, struct wlr_surface *surface);
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
struct wlr_scene_drag_icon {
|
||||
struct wlr_scene_tree *tree;
|
||||
struct wlr_scene_tree *surface_tree;
|
||||
struct wlr_scene_subsurface_tree *surface_tree;
|
||||
struct wlr_drag_icon *drag_icon;
|
||||
|
||||
struct wl_listener tree_destroy;
|
||||
|
|
@ -17,7 +17,7 @@ static void drag_icon_handle_surface_commit(struct wl_listener *listener, void *
|
|||
struct wlr_scene_drag_icon *icon =
|
||||
wl_container_of(listener, icon, drag_icon_surface_commit);
|
||||
struct wlr_surface *surface = icon->drag_icon->surface;
|
||||
struct wlr_scene_node *node = &icon->surface_tree->node;
|
||||
struct wlr_scene_node *node = &icon->surface_tree->tree->node;
|
||||
wlr_scene_node_set_position(node,
|
||||
node->x + surface->current.dx, node->y + surface->current.dy);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ struct wlr_scene_layer_surface_v1 *wlr_scene_layer_surface_v1_create(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct wlr_scene_tree *surface_tree = wlr_scene_subsurface_tree_create(
|
||||
struct wlr_scene_subsurface_tree *surface_tree = wlr_scene_subsurface_tree_create(
|
||||
scene_layer_surface->tree, layer_surface->surface);
|
||||
if (surface_tree == NULL) {
|
||||
wlr_scene_node_destroy(&scene_layer_surface->tree->node);
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ struct wlr_scene_subsurface_tree_surface {
|
|||
struct wlr_scene_tree *tree;
|
||||
struct wlr_surface *surface;
|
||||
struct wlr_scene_surface *scene_surface;
|
||||
struct wlr_scene_subsurface_tree *subsurface_tree;
|
||||
|
||||
struct wl_listener surface_destroy;
|
||||
struct wl_listener surface_commit;
|
||||
|
|
@ -42,6 +43,8 @@ static void subsurface_tree_addon_destroy(struct wlr_addon *addon) {
|
|||
if (subsurface_tree->parent) {
|
||||
wlr_addon_finish(&subsurface_tree->surface_addon);
|
||||
wl_list_remove(&subsurface_tree->subsurface_destroy.link);
|
||||
} else {
|
||||
free(subsurface_tree->subsurface_tree);
|
||||
}
|
||||
wlr_addon_finish(&subsurface_tree->scene_addon);
|
||||
wl_list_remove(&subsurface_tree->surface_destroy.link);
|
||||
|
|
@ -197,14 +200,15 @@ static const struct wlr_addon_interface subsurface_tree_surface_addon_impl = {
|
|||
.destroy = subsurface_tree_surface_addon_destroy,
|
||||
};
|
||||
|
||||
static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create(
|
||||
static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create_surface(
|
||||
struct wlr_scene_subsurface_tree *tree,
|
||||
struct wlr_scene_tree *parent, struct wlr_surface *surface);
|
||||
|
||||
static bool subsurface_tree_create_subsurface(
|
||||
struct wlr_scene_subsurface_tree_surface *parent,
|
||||
struct wlr_subsurface *subsurface) {
|
||||
struct wlr_scene_subsurface_tree_surface *child = scene_surface_tree_create(
|
||||
parent->tree, subsurface->surface);
|
||||
struct wlr_scene_subsurface_tree_surface *child = scene_surface_tree_create_surface(
|
||||
parent->subsurface_tree, parent->tree, subsurface->surface);
|
||||
if (child == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -235,7 +239,8 @@ static const struct wlr_addon_interface subsurface_tree_addon_impl = {
|
|||
.destroy = subsurface_tree_addon_destroy,
|
||||
};
|
||||
|
||||
static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create(
|
||||
static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create_surface(
|
||||
struct wlr_scene_subsurface_tree *tree,
|
||||
struct wlr_scene_tree *parent, struct wlr_surface *surface) {
|
||||
struct wlr_scene_subsurface_tree_surface *subsurface_tree =
|
||||
calloc(1, sizeof(*subsurface_tree));
|
||||
|
|
@ -243,6 +248,7 @@ static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
subsurface_tree->subsurface_tree = tree;
|
||||
subsurface_tree->tree = wlr_scene_tree_create(parent);
|
||||
if (subsurface_tree->tree == NULL) {
|
||||
goto error_surface_tree;
|
||||
|
|
@ -303,14 +309,22 @@ error_surface_tree:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct wlr_scene_tree *wlr_scene_subsurface_tree_create(
|
||||
struct wlr_scene_subsurface_tree *wlr_scene_subsurface_tree_create(
|
||||
struct wlr_scene_tree *parent, struct wlr_surface *surface) {
|
||||
struct wlr_scene_subsurface_tree_surface *subsurface_tree =
|
||||
scene_surface_tree_create(parent, surface);
|
||||
if (subsurface_tree == NULL) {
|
||||
struct wlr_scene_subsurface_tree *subsurface_tree = calloc(1, sizeof(*subsurface_tree));
|
||||
if (!subsurface_tree) {
|
||||
return NULL;
|
||||
}
|
||||
return subsurface_tree->tree;
|
||||
|
||||
struct wlr_scene_subsurface_tree_surface *subsurface_tree_surface =
|
||||
scene_surface_tree_create_surface(subsurface_tree, parent, surface);
|
||||
if (subsurface_tree_surface == NULL) {
|
||||
free(subsurface_tree);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
subsurface_tree->tree = subsurface_tree_surface->tree;
|
||||
return subsurface_tree;
|
||||
}
|
||||
|
||||
static struct wlr_scene_subsurface_tree_surface *get_subsurface_tree_from_node(
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
struct wlr_scene_xdg_surface {
|
||||
struct wlr_scene_tree *tree;
|
||||
struct wlr_xdg_surface *xdg_surface;
|
||||
struct wlr_scene_tree *surface_tree;
|
||||
struct wlr_scene_subsurface_tree *surface_tree;
|
||||
|
||||
struct wl_listener tree_destroy;
|
||||
struct wl_listener xdg_surface_destroy;
|
||||
|
|
@ -36,7 +36,7 @@ static void scene_xdg_surface_update_position(
|
|||
|
||||
struct wlr_box geo = {0};
|
||||
wlr_xdg_surface_get_geometry(xdg_surface, &geo);
|
||||
wlr_scene_node_set_position(&scene_xdg_surface->surface_tree->node,
|
||||
wlr_scene_node_set_position(&scene_xdg_surface->surface_tree->tree->node,
|
||||
-geo.x, -geo.y);
|
||||
|
||||
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue