diff options
author | Alexander Orzechowski <[email protected]> | 2022-05-30 19:23:27 -0400 |
---|---|---|
committer | Isaac Freund <[email protected]> | 2022-05-31 09:14:28 +0000 |
commit | 3a68007693f9d91c3b6dc12a204455df36ae65a1 (patch) | |
tree | 5f94066a759f10ff958f091854ef6ac8a7cbf98f | |
parent | 6975c82d95080589882b71083f67dc905e5a7f80 (diff) |
wlr_scene: Only allow parenting on a wlr_scene_tree
-rw-r--r-- | layer_shell_v1.c | 27 | ||||
-rw-r--r-- | subsurface_tree.c | 14 | ||||
-rw-r--r-- | surface.c | 2 | ||||
-rw-r--r-- | wlr_scene.c | 54 | ||||
-rw-r--r-- | xdg_shell.c | 16 |
5 files changed, 65 insertions, 48 deletions
diff --git a/layer_shell_v1.c b/layer_shell_v1.c index 1c2b6e4..eb0bc76 100644 --- a/layer_shell_v1.c +++ b/layer_shell_v1.c @@ -18,21 +18,21 @@ static void scene_layer_surface_handle_layer_surface_destroy( struct wl_listener *listener, void *data) { struct wlr_scene_layer_surface_v1 *scene_layer_surface = wl_container_of(listener, scene_layer_surface, layer_surface_destroy); - wlr_scene_node_destroy(scene_layer_surface->node); + wlr_scene_node_destroy(&scene_layer_surface->tree->node); } static void scene_layer_surface_handle_layer_surface_map( struct wl_listener *listener, void *data) { struct wlr_scene_layer_surface_v1 *scene_layer_surface = wl_container_of(listener, scene_layer_surface, layer_surface_map); - wlr_scene_node_set_enabled(scene_layer_surface->node, true); + wlr_scene_node_set_enabled(&scene_layer_surface->tree->node, true); } static void scene_layer_surface_handle_layer_surface_unmap( struct wl_listener *listener, void *data) { struct wlr_scene_layer_surface_v1 *scene_layer_surface = wl_container_of(listener, scene_layer_surface, layer_surface_unmap); - wlr_scene_node_set_enabled(scene_layer_surface->node, false); + wlr_scene_node_set_enabled(&scene_layer_surface->tree->node, false); } static void layer_surface_exclusive_zone( @@ -122,7 +122,7 @@ void wlr_scene_layer_surface_v1_configure( box.y = bounds.y + bounds.height/2 - box.height/2; } - wlr_scene_node_set_position(scene_layer_surface->node, box.x, box.y); + wlr_scene_node_set_position(&scene_layer_surface->tree->node, box.x, box.y); wlr_layer_surface_v1_configure(layer_surface, box.width, box.height); if (state->exclusive_zone > 0) { @@ -131,7 +131,7 @@ void wlr_scene_layer_surface_v1_configure( } struct wlr_scene_layer_surface_v1 *wlr_scene_layer_surface_v1_create( - struct wlr_scene_node *parent, + struct wlr_scene_tree *parent, struct wlr_layer_surface_v1 *layer_surface) { struct wlr_scene_layer_surface_v1 *scene_layer_surface = calloc(1, sizeof(*scene_layer_surface)); @@ -141,24 +141,23 @@ struct wlr_scene_layer_surface_v1 *wlr_scene_layer_surface_v1_create( scene_layer_surface->layer_surface = layer_surface; - struct wlr_scene_tree *tree = wlr_scene_tree_create(parent); - if (tree == NULL) { + scene_layer_surface->tree = wlr_scene_tree_create(parent); + if (scene_layer_surface->tree == NULL) { free(scene_layer_surface); return NULL; } - scene_layer_surface->node = &tree->node; - struct wlr_scene_node *surface_node = wlr_scene_subsurface_tree_create( - scene_layer_surface->node, layer_surface->surface); - if (surface_node == NULL) { - wlr_scene_node_destroy(scene_layer_surface->node); + struct wlr_scene_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); free(scene_layer_surface); return NULL; } scene_layer_surface->tree_destroy.notify = scene_layer_surface_handle_tree_destroy; - wl_signal_add(&scene_layer_surface->node->events.destroy, + wl_signal_add(&scene_layer_surface->tree->node.events.destroy, &scene_layer_surface->tree_destroy); scene_layer_surface->layer_surface_destroy.notify = @@ -176,7 +175,7 @@ struct wlr_scene_layer_surface_v1 *wlr_scene_layer_surface_v1_create( wl_signal_add(&layer_surface->events.unmap, &scene_layer_surface->layer_surface_unmap); - wlr_scene_node_set_enabled(scene_layer_surface->node, + wlr_scene_node_set_enabled(&scene_layer_surface->tree->node, layer_surface->mapped); return scene_layer_surface; diff --git a/subsurface_tree.c b/subsurface_tree.c index 1cb2977..35420ab 100644 --- a/subsurface_tree.c +++ b/subsurface_tree.c @@ -148,13 +148,13 @@ static const struct wlr_addon_interface subsurface_tree_addon_impl = { }; static struct wlr_scene_subsurface_tree *scene_surface_tree_create( - struct wlr_scene_node *parent, struct wlr_surface *surface); + struct wlr_scene_tree *parent, struct wlr_surface *surface); static bool subsurface_tree_create_subsurface( struct wlr_scene_subsurface_tree *parent, struct wlr_subsurface *subsurface) { struct wlr_scene_subsurface_tree *child = scene_surface_tree_create( - &parent->tree->node, subsurface->surface); + parent->tree, subsurface->surface); if (child == NULL) { return false; } @@ -188,7 +188,7 @@ static void subsurface_tree_handle_surface_new_subsurface( } static struct wlr_scene_subsurface_tree *scene_surface_tree_create( - struct wlr_scene_node *parent, struct wlr_surface *surface) { + struct wlr_scene_tree *parent, struct wlr_surface *surface) { struct wlr_scene_subsurface_tree *subsurface_tree = calloc(1, sizeof(*subsurface_tree)); if (subsurface_tree == NULL) { @@ -201,7 +201,7 @@ static struct wlr_scene_subsurface_tree *scene_surface_tree_create( } subsurface_tree->scene_surface = - wlr_scene_surface_create(&subsurface_tree->tree->node, surface); + wlr_scene_surface_create(subsurface_tree->tree, surface); if (subsurface_tree->scene_surface == NULL) { goto error_scene_surface; } @@ -248,12 +248,12 @@ error_surface_tree: return NULL; } -struct wlr_scene_node *wlr_scene_subsurface_tree_create( - struct wlr_scene_node *parent, struct wlr_surface *surface) { +struct wlr_scene_tree *wlr_scene_subsurface_tree_create( + struct wlr_scene_tree *parent, struct wlr_surface *surface) { struct wlr_scene_subsurface_tree *subsurface_tree = scene_surface_tree_create(parent, surface); if (subsurface_tree == NULL) { return NULL; } - return &subsurface_tree->tree->node; + return subsurface_tree->tree; } @@ -135,7 +135,7 @@ struct wlr_scene_surface *wlr_scene_surface_from_buffer( return surface; } -struct wlr_scene_surface *wlr_scene_surface_create(struct wlr_scene_node *parent, +struct wlr_scene_surface *wlr_scene_surface_create(struct wlr_scene_tree *parent, struct wlr_surface *wlr_surface) { struct wlr_scene_surface *surface = calloc(1, sizeof(*surface)); if (surface == NULL) { diff --git a/wlr_scene.c b/wlr_scene.c index 410fbe3..e60ff5d 100644 --- a/wlr_scene.c +++ b/wlr_scene.c @@ -17,6 +17,11 @@ #define HIGHLIGHT_DAMAGE_FADEOUT_TIME 250 +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; +} + static struct wlr_scene_rect *scene_rect_from_node( struct wlr_scene_node *node) { assert(node->type == WLR_SCENE_NODE_RECT); @@ -30,10 +35,17 @@ struct wlr_scene_buffer *wlr_scene_buffer_from_node( } struct wlr_scene *scene_node_get_root(struct wlr_scene_node *node) { - while (node->parent != NULL) { - node = node->parent; + struct wlr_scene_tree *tree; + if (node->type == WLR_SCENE_NODE_TREE) { + tree = scene_tree_from_node(node); + } else { + tree = node->parent; + } + + while (tree->node.parent != NULL) { + tree = tree->node.parent; } - return (struct wlr_scene *)node; + return (struct wlr_scene *)tree; } static void scene_node_state_init(struct wlr_scene_node_state *state) { @@ -48,7 +60,7 @@ static void scene_node_state_finish(struct wlr_scene_node_state *state) { } static void scene_node_init(struct wlr_scene_node *node, - enum wlr_scene_node_type type, struct wlr_scene_node *parent) { + enum wlr_scene_node_type type, struct wlr_scene_tree *parent) { memset(node, 0, sizeof(*node)); node->type = type; node->parent = parent; @@ -56,7 +68,7 @@ static void scene_node_init(struct wlr_scene_node *node, wl_signal_init(&node->events.destroy); if (parent != NULL) { - wl_list_insert(parent->state.children.prev, &node->state.link); + wl_list_insert(parent->node.state.children.prev, &node->state.link); } wlr_addon_set_init(&node->addons); @@ -136,7 +148,7 @@ void wlr_scene_node_destroy(struct wlr_scene_node *node) { } static void scene_tree_init(struct wlr_scene_tree *tree, - struct wlr_scene_node *parent) { + struct wlr_scene_tree *parent) { memset(tree, 0, sizeof(*tree)); scene_node_init(&tree->node, WLR_SCENE_NODE_TREE, parent); } @@ -172,7 +184,7 @@ struct wlr_scene *wlr_scene_create(void) { return scene; } -struct wlr_scene_tree *wlr_scene_tree_create(struct wlr_scene_node *parent) { +struct wlr_scene_tree *wlr_scene_tree_create(struct wlr_scene_tree *parent) { assert(parent); struct wlr_scene_tree *tree = calloc(1, sizeof(struct wlr_scene_tree)); @@ -251,7 +263,7 @@ static void scene_node_update_outputs(struct wlr_scene_node *node) { _scene_node_update_outputs(node, lx, ly, scene); } -struct wlr_scene_rect *wlr_scene_rect_create(struct wlr_scene_node *parent, +struct wlr_scene_rect *wlr_scene_rect_create(struct wlr_scene_tree *parent, int width, int height, const float color[static 4]) { struct wlr_scene_rect *scene_rect = calloc(1, sizeof(struct wlr_scene_rect)); @@ -290,7 +302,7 @@ void wlr_scene_rect_set_color(struct wlr_scene_rect *rect, const float color[sta scene_node_damage_whole(&rect->node); } -struct wlr_scene_buffer *wlr_scene_buffer_create(struct wlr_scene_node *parent, +struct wlr_scene_buffer *wlr_scene_buffer_create(struct wlr_scene_tree *parent, struct wlr_buffer *buffer) { struct wlr_scene_buffer *scene_buffer = calloc(1, sizeof(*scene_buffer)); if (scene_buffer == NULL) { @@ -615,7 +627,7 @@ void wlr_scene_node_place_below(struct wlr_scene_node *node, void wlr_scene_node_raise_to_top(struct wlr_scene_node *node) { struct wlr_scene_node *current_top = wl_container_of( - node->parent->state.children.prev, current_top, state.link); + node->parent->node.state.children.prev, current_top, state.link); if (node == current_top) { return; } @@ -624,7 +636,7 @@ void wlr_scene_node_raise_to_top(struct wlr_scene_node *node) { void wlr_scene_node_lower_to_bottom(struct wlr_scene_node *node) { struct wlr_scene_node *current_bottom = wl_container_of( - node->parent->state.children.next, current_bottom, state.link); + node->parent->node.state.children.next, current_bottom, state.link); if (node == current_bottom) { return; } @@ -632,7 +644,7 @@ void wlr_scene_node_lower_to_bottom(struct wlr_scene_node *node) { } void wlr_scene_node_reparent(struct wlr_scene_node *node, - struct wlr_scene_node *new_parent) { + struct wlr_scene_tree *new_parent) { assert(new_parent != NULL); if (node->parent == new_parent) { @@ -640,16 +652,16 @@ void wlr_scene_node_reparent(struct wlr_scene_node *node, } /* Ensure that a node cannot become its own ancestor */ - for (struct wlr_scene_node *ancestor = new_parent; ancestor != NULL; - ancestor = ancestor->parent) { - assert(ancestor != node); + for (struct wlr_scene_tree *ancestor = new_parent; ancestor != NULL; + ancestor = ancestor->node.parent) { + assert(&ancestor->node != node); } scene_node_damage_whole(node); wl_list_remove(&node->state.link); node->parent = new_parent; - wl_list_insert(new_parent->state.children.prev, &node->state.link); + wl_list_insert(new_parent->node.state.children.prev, &node->state.link); scene_node_damage_whole(node); @@ -658,13 +670,19 @@ void wlr_scene_node_reparent(struct wlr_scene_node *node, bool wlr_scene_node_coords(struct wlr_scene_node *node, int *lx_ptr, int *ly_ptr) { + assert(node); + int lx = 0, ly = 0; bool enabled = true; - while (node != NULL) { + while (true) { lx += node->state.x; ly += node->state.y; enabled = enabled && node->state.enabled; - node = node->parent; + if (node->parent == NULL) { + break; + } + + node = &node->parent->node; } *lx_ptr = lx; diff --git a/xdg_shell.c b/xdg_shell.c index 909719d..1688348 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -5,7 +5,7 @@ struct wlr_scene_xdg_surface { struct wlr_scene_tree *tree; struct wlr_xdg_surface *xdg_surface; - struct wlr_scene_node *surface_node; + struct wlr_scene_tree *surface_tree; struct wl_listener tree_destroy; struct wl_listener xdg_surface_destroy; @@ -54,7 +54,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_node, + wlr_scene_node_set_position(&scene_xdg_surface->surface_tree->node, -geo.x, -geo.y); if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) { @@ -71,8 +71,8 @@ static void scene_xdg_surface_handle_xdg_surface_commit(struct wl_listener *list scene_xdg_surface_update_position(scene_xdg_surface); } -struct wlr_scene_node *wlr_scene_xdg_surface_create( - struct wlr_scene_node *parent, struct wlr_xdg_surface *xdg_surface) { +struct wlr_scene_tree *wlr_scene_xdg_surface_create( + struct wlr_scene_tree *parent, struct wlr_xdg_surface *xdg_surface) { struct wlr_scene_xdg_surface *scene_xdg_surface = calloc(1, sizeof(*scene_xdg_surface)); if (scene_xdg_surface == NULL) { @@ -87,9 +87,9 @@ struct wlr_scene_node *wlr_scene_xdg_surface_create( return NULL; } - scene_xdg_surface->surface_node = wlr_scene_subsurface_tree_create( - &scene_xdg_surface->tree->node, xdg_surface->surface); - if (scene_xdg_surface->surface_node == NULL) { + scene_xdg_surface->surface_tree = wlr_scene_subsurface_tree_create( + scene_xdg_surface->tree, xdg_surface->surface); + if (scene_xdg_surface->surface_tree == NULL) { wlr_scene_node_destroy(&scene_xdg_surface->tree->node); free(scene_xdg_surface); return NULL; @@ -120,5 +120,5 @@ struct wlr_scene_node *wlr_scene_xdg_surface_create( wlr_scene_node_set_enabled(&scene_xdg_surface->tree->node, xdg_surface->mapped); scene_xdg_surface_update_position(scene_xdg_surface); - return &scene_xdg_surface->tree->node; + return scene_xdg_surface->tree; } |