]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Chase wlroots: every scene_node parent is now a tree
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Sun, 5 Jun 2022 13:17:35 +0000 (15:17 +0200)
committerJohan Malm <johanmalm@users.noreply.github.com>
Tue, 7 Jun 2022 06:13:37 +0000 (07:13 +0100)
Chases wlroots ccd0f85c2a36308e35b153c7f9653abac7659af3
wlr_scene: Only allow parenting on a wlr_scene_tree

20 files changed:
include/layers.h
include/ssd.h
src/debug.c
src/desktop.c
src/layers.c
src/menu/menu.c
src/osd.c
src/output.c
src/server.c
src/ssd/ssd.c
src/ssd/ssd_border.c
src/ssd/ssd_extents.c
src/ssd/ssd_part.c
src/ssd/ssd_titlebar.c
src/view.c
src/xdg-popup.c
src/xdg.c
src/xwayland-unmanaged.c
src/xwayland.c
subprojects/wlroots.wrap

index b40c0cac999174866fe04ab034fa457ba0ae3b8d..3bc07c2b079064ea0370120a3d0e039a44a4b8be 100644 (file)
@@ -26,7 +26,7 @@ struct lab_layer_surface {
 
 struct lab_layer_popup {
        struct wlr_xdg_popup *wlr_popup;
-       struct wlr_scene_node *scene_node;
+       struct wlr_scene_tree *scene_tree;
 
        /* To simplify moving popup nodes from the bottom to the top layer */
        struct wlr_box output_toplevel_sx_box;
index e3feee0a90e5fe4dffee2d8827a6ad4cf5fd4f48..69b82c99bff02bd98327073efc3b0a048735c7d9 100644 (file)
@@ -150,18 +150,18 @@ struct ssd_part *add_scene_part(
        struct wl_list *part_list, enum ssd_part_type type);
 struct ssd_part *add_scene_rect(
        struct wl_list *list, enum ssd_part_type type,
-       struct wlr_scene_node *parent, int width, int height, int x, int y,
+       struct wlr_scene_tree *parent, int width, int height, int x, int y,
        float color[4]);
 struct ssd_part *add_scene_buffer(
        struct wl_list *list, enum ssd_part_type type,
-       struct wlr_scene_node *parent, struct wlr_buffer *buffer, int x, int y);
+       struct wlr_scene_tree *parent, struct wlr_buffer *buffer, int x, int y);
 struct ssd_part *add_scene_button(
        struct wl_list *part_list, enum ssd_part_type type,
-       struct wlr_scene_node *parent, float *bg_color,
+       struct wlr_scene_tree *parent, float *bg_color,
        struct wlr_buffer *icon_buffer, int x);
 struct ssd_part *add_scene_button_corner(
        struct wl_list *part_list, enum ssd_part_type type,
-       struct wlr_scene_node *parent, struct wlr_buffer *corner_buffer,
+       struct wlr_scene_tree *parent, struct wlr_buffer *corner_buffer,
        struct wlr_buffer *icon_buffer, int x);
 
 /* SSD internal helpers */
index 510bb0a6bc017e2c9c71150d7d75a8a861db998e..a22e633d2be5e44b971b1b17dfdae18887fb4e7a 100644 (file)
@@ -93,7 +93,7 @@ get_special(struct server *server, struct wlr_scene_node *node,
        if (node == &server->menu_tree->node) {
                return "server->menu_tree";
        }
-       if (node->parent == &server->scene->tree.node) {
+       if (node->parent == &server->scene->tree) {
                struct output *output;
                wl_list_for_each(output, &server->outputs, link) {
                        if (node == &output->osd_tree->node) {
@@ -117,9 +117,8 @@ get_special(struct server *server, struct wlr_scene_node *node,
        if (node == &server->view_tree_always_on_top->node) {
                return "server->view_tree_always_on_top";
        }
-       if (node->parent == &server->view_tree->node ||
-                       node->parent == &server->view_tree_always_on_top->node) {
-               *last_view = node_view_from_node(node);
+       if (node->parent == server->view_tree ||
+                       node->parent == server->view_tree_always_on_top) {
                *last_view = node_view_from_node(node);
        }
        const char *view_part = get_view_part(*last_view, node);
index 933d71b708a67a2766366004a7a6a8cff1b5bb52..3ad77207267df99f568f78d390a40c22ceef82ab 100644 (file)
@@ -278,7 +278,7 @@ desktop_node_and_view_at(struct server *server, double lx, double ly,
                        return NULL;
                }
 #if HAVE_XWAYLAND
-               if (node->parent == &server->unmanaged_tree->node) {
+               if (node->parent == server->unmanaged_tree) {
                        *view_area = LAB_SSD_UNMANAGED;
                        return NULL;
                }
@@ -311,7 +311,8 @@ desktop_node_and_view_at(struct server *server, double lx, double ly,
                                return NULL;
                        }
                }
-               node = node->parent;
+               /* node->parent is always a *wlr_scene_tree */
+               node = node->parent ? &node->parent->node : NULL;
        }
        if (!node) {
                wlr_log(WLR_ERROR, "Unknown node detected");
index 9d18e23df1b7d5626199f742dae7d949ecc01137..1a93d691de359e39630a80d8838a139b0e02f7b3 100644 (file)
@@ -174,7 +174,7 @@ popup_handle_destroy(struct wl_listener *listener, void *data)
 static void popup_handle_new_popup(struct wl_listener *listener, void *data);
 
 static struct lab_layer_popup *
-create_popup(struct wlr_xdg_popup *wlr_popup, struct wlr_scene_node *parent,
+create_popup(struct wlr_xdg_popup *wlr_popup, struct wlr_scene_tree *parent,
                struct wlr_box *output_toplevel_sx_box)
 {
        struct lab_layer_popup *popup =
@@ -184,13 +184,13 @@ create_popup(struct wlr_xdg_popup *wlr_popup, struct wlr_scene_node *parent,
        }
 
        popup->wlr_popup = wlr_popup;
-       popup->scene_node =
+       popup->scene_tree =
                wlr_scene_xdg_surface_create(parent, wlr_popup->base);
-       if (!popup->scene_node) {
+       if (!popup->scene_tree) {
                free(popup);
                return NULL;
        }
-       node_descriptor_create(popup->scene_node,
+       node_descriptor_create(&popup->scene_tree->node,
                LAB_NODE_DESC_LAYER_POPUP, popup);
 
        popup->destroy.notify = popup_handle_destroy;
@@ -210,7 +210,7 @@ popup_handle_new_popup(struct wl_listener *listener, void *data)
                wl_container_of(listener, lab_layer_popup, new_popup);
        struct wlr_xdg_popup *wlr_popup = data;
        struct lab_layer_popup *new_popup = create_popup(wlr_popup,
-               lab_layer_popup->scene_node,
+               lab_layer_popup->scene_tree,
                &lab_layer_popup->output_toplevel_sx_box);
        new_popup->output_toplevel_sx_box =
                lab_layer_popup->output_toplevel_sx_box;
@@ -230,11 +230,12 @@ move_popup_to_top_layer(struct lab_layer_surface *toplevel,
        struct output *output = output_from_wlr_output(server, wlr_output);
        struct wlr_box box = { 0 };
        wlr_output_layout_get_box(server->output_layout, wlr_output, &box);
-       int lx = toplevel->scene_layer_surface->node->state.x + box.x;
-       int ly = toplevel->scene_layer_surface->node->state.y + box.y;
+       int lx = toplevel->scene_layer_surface->tree->node.state.x + box.x;
+       int ly = toplevel->scene_layer_surface->tree->node.state.y + box.y;
 
-       struct wlr_scene_node *node = popup->scene_node;
-       wlr_scene_node_reparent(node, &output->layer_popup_tree->node);
+       struct wlr_scene_node *node = &popup->scene_tree->node;
+       wlr_scene_node_reparent(node, output->layer_popup_tree);
+       /* FIXME: verify the whole tree should be repositioned */
        wlr_scene_node_set_position(&output->layer_popup_tree->node, lx, ly);
 }
 
@@ -253,7 +254,7 @@ new_popup_notify(struct wl_listener *listener, void *data)
                output->wlr_output, &output_box);
 
        int lx, ly;
-       wlr_scene_node_coords(toplevel->scene_layer_surface->node, &lx, &ly);
+       wlr_scene_node_coords(&toplevel->scene_layer_surface->tree->node, &lx, &ly);
 
        /*
         * Output geometry expressed in the coordinate system of the toplevel
@@ -268,7 +269,7 @@ new_popup_notify(struct wl_listener *listener, void *data)
                .height = output_box.height,
        };
        struct lab_layer_popup *popup = create_popup(wlr_popup,
-               toplevel->scene_layer_surface->node,
+               toplevel->scene_layer_surface->tree,
                &output_toplevel_sx_box);
        popup->output_toplevel_sx_box = output_toplevel_sx_box;
 
@@ -320,14 +321,14 @@ new_layer_surface_notify(struct wl_listener *listener, void *data)
                output->layer_tree[layer_surface->current.layer];
 
        surface->scene_layer_surface = wlr_scene_layer_surface_v1_create(
-               &selected_layer->node, layer_surface);
+               selected_layer, layer_surface);
        if (!surface->scene_layer_surface) {
                wlr_layer_surface_v1_destroy(layer_surface);
                wlr_log(WLR_ERROR, "could not create layer surface");
                return;
        }
 
-       node_descriptor_create(surface->scene_layer_surface->node,
+       node_descriptor_create(&surface->scene_layer_surface->tree->node,
                LAB_NODE_DESC_LAYER_SURFACE, surface);
 
        surface->server = server;
index 374ea295bc3f29df10af559776520daeb1ce256c..d4ad30df49c5020e89c1148dfa2d6ce0556929f1 100644 (file)
@@ -54,7 +54,7 @@ menu_create(struct server *server, const char *id, const char *label)
        menu->server = server;
        menu->size.width = MENUWIDTH;
        /* menu->size.height will be kept up to date by adding items */
-       menu->scene_tree = wlr_scene_tree_create(&server->menu_tree->node);
+       menu->scene_tree = wlr_scene_tree_create(server->menu_tree);
        wlr_scene_node_set_enabled(&menu->scene_tree->node, false);
        return menu;
 }
@@ -117,29 +117,29 @@ item_create(struct menu *menu, const char *text)
        }
 
        /* Menu item root node */
-       menuitem->tree = wlr_scene_tree_create(&menu->scene_tree->node);
+       menuitem->tree = wlr_scene_tree_create(menu->scene_tree);
        node_descriptor_create(&menuitem->tree->node,
                LAB_NODE_DESC_MENUITEM, menuitem);
 
        /* Tree for each state to hold background and text buffer */
-       menuitem->normal.tree = wlr_scene_tree_create(&menuitem->tree->node);
-       menuitem->selected.tree = wlr_scene_tree_create(&menuitem->tree->node);
+       menuitem->normal.tree = wlr_scene_tree_create(menuitem->tree);
+       menuitem->selected.tree = wlr_scene_tree_create(menuitem->tree);
 
        /* Item background nodes */
        menuitem->normal.background = &wlr_scene_rect_create(
-               &menuitem->normal.tree->node,
+               menuitem->normal.tree,
                MENUWIDTH, menu->item_height,
                theme->menu_items_bg_color)->node;
        menuitem->selected.background = &wlr_scene_rect_create(
-               &menuitem->selected.tree->node,
+               menuitem->selected.tree,
                MENUWIDTH, menu->item_height,
                theme->menu_items_active_bg_color)->node;
 
        /* Font nodes */
        menuitem->normal.text = &wlr_scene_buffer_create(
-               &menuitem->normal.tree->node, &menuitem->normal.buffer->base)->node;
+               menuitem->normal.tree, &menuitem->normal.buffer->base)->node;
        menuitem->selected.text = &wlr_scene_buffer_create(
-               &menuitem->selected.tree->node, &menuitem->selected.buffer->base)->node;
+               menuitem->selected.tree, &menuitem->selected.buffer->base)->node;
 
        /* Center font nodes */
        y = (menu->item_height - menuitem->normal.buffer->base.height) / 2;
index e946afc52bf64314d8cc3d4c7fb3663fb97ffa84..29fa07eccd51e833a359c7f734ac67c3ba6d583f 100644 (file)
--- a/src/osd.c
+++ b/src/osd.c
@@ -224,7 +224,7 @@ osd_update(struct server *server)
                cairo_surface_flush(surf);
 
                struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_create(
-                       &output->osd_tree->node, &output->osd_buffer->base);
+                       output->osd_tree, &output->osd_buffer->base);
 
                /* Center OSD */
                struct wlr_box output_box;
index 757afcca5fc61b185baa9aa92439e99f817458fb..7f6ac9affc7ecffd2a87c12e9a96fba3a243c0d4 100644 (file)
@@ -135,14 +135,14 @@ new_output_notify(struct wl_listener *listener, void *data)
        for (int i = 0; i < nr_layers; i++) {
                wl_list_init(&output->layers[i]);
                output->layer_tree[i] =
-                       wlr_scene_tree_create(&server->scene->tree.node);
+                       wlr_scene_tree_create(&server->scene->tree);
                node_descriptor_create(&output->layer_tree[i]->node,
                        LAB_NODE_DESC_TREE, NULL);
        }
-       output->layer_popup_tree = wlr_scene_tree_create(&server->scene->tree.node);
+       output->layer_popup_tree = wlr_scene_tree_create(&server->scene->tree);
        node_descriptor_create(&output->layer_popup_tree->node,
                LAB_NODE_DESC_TREE, NULL);
-       output->osd_tree = wlr_scene_tree_create(&server->scene->tree.node);
+       output->osd_tree = wlr_scene_tree_create(&server->scene->tree);
        node_descriptor_create(&output->osd_tree->node,
                LAB_NODE_DESC_TREE, NULL);
 
index 1e85730d5f0095035fe9d2979d2bd77430e0ee82..7ad7c427756efed0969897274d9b7a8d0c1d8c77 100644 (file)
@@ -238,12 +238,12 @@ server_init(struct server *server)
                wlr_log(WLR_ERROR, "unable to create scene");
                exit(EXIT_FAILURE);
        }
-       server->view_tree = wlr_scene_tree_create(&server->scene->tree.node);
-       server->view_tree_always_on_top = wlr_scene_tree_create(&server->scene->tree.node);
+       server->view_tree = wlr_scene_tree_create(&server->scene->tree);
+       server->view_tree_always_on_top = wlr_scene_tree_create(&server->scene->tree);
 #if HAVE_XWAYLAND
-       server->unmanaged_tree = wlr_scene_tree_create(&server->scene->tree.node);
+       server->unmanaged_tree = wlr_scene_tree_create(&server->scene->tree);
 #endif
-       server->menu_tree = wlr_scene_tree_create(&server->scene->tree.node);
+       server->menu_tree = wlr_scene_tree_create(&server->scene->tree);
 
        output_init(server);
 
index d10aabca7460e2faedf2369e160d8c2a3d5b4715..c60048f7fa1061cfa017416bbf5beb04742655a6 100644 (file)
@@ -62,31 +62,31 @@ ssd_get_part_type(struct view *view, struct wlr_scene_node *node)
        }
 
        struct wl_list *part_list = NULL;
-       struct wlr_scene_node *grandparent =
-               node->parent ? node->parent->parent : NULL;
+       struct wlr_scene_tree *grandparent =
+               node->parent ? node->parent->node.parent : NULL;
 
        /* active titlebar */
-       if (node->parent == &view->ssd.titlebar.active.tree->node) {
+       if (node->parent == view->ssd.titlebar.active.tree) {
                part_list = &view->ssd.titlebar.active.parts;
-       } else if (grandparent == &view->ssd.titlebar.active.tree->node) {
+       } else if (grandparent == view->ssd.titlebar.active.tree) {
                part_list = &view->ssd.titlebar.active.parts;
 
        /* extents */
-       } else if (node->parent == &view->ssd.extents.tree->node) {
+       } else if (node->parent == view->ssd.extents.tree) {
                part_list = &view->ssd.extents.parts;
 
        /* active border */
-       } else if (node->parent == &view->ssd.border.active.tree->node) {
+       } else if (node->parent == view->ssd.border.active.tree) {
                part_list = &view->ssd.border.active.parts;
 
        /* inactive titlebar */
-       } else if (node->parent == &view->ssd.titlebar.inactive.tree->node) {
+       } else if (node->parent == view->ssd.titlebar.inactive.tree) {
                part_list = &view->ssd.titlebar.inactive.parts;
-       } else if (grandparent == &view->ssd.titlebar.inactive.tree->node) {
+       } else if (grandparent == view->ssd.titlebar.inactive.tree) {
                part_list = &view->ssd.titlebar.inactive.parts;
 
        /* inactive border */
-       } else if (node->parent == &view->ssd.border.inactive.tree->node) {
+       } else if (node->parent == view->ssd.border.inactive.tree) {
                part_list = &view->ssd.border.inactive.parts;
        }
 
@@ -154,7 +154,7 @@ ssd_create(struct view *view)
                return;
        }
 
-       view->ssd.tree = wlr_scene_tree_create(&view->scene_tree->node);
+       view->ssd.tree = wlr_scene_tree_create(view->scene_tree);
        wlr_scene_node_lower_to_bottom(&view->ssd.tree->node);
        ssd_extents_create(view);
        ssd_border_create(view);
index 01c1869fbc53609908e35cba11573c093edf9693..719012c27cc54e9c55af7ea706ee01fb00076c0b 100644 (file)
@@ -18,18 +18,18 @@ ssd_border_create(struct view *view)
        int full_width = width + 2 * theme->border_width;
 
        float *color;
-       struct wlr_scene_node *parent;
+       struct wlr_scene_tree *parent;
        struct ssd_sub_tree *subtree;
 
        FOR_EACH_STATE(view, subtree) {
-               subtree->tree = wlr_scene_tree_create(&view->ssd.tree->node);
-               parent = &subtree->tree->node;
-               wlr_scene_node_set_position(parent, -theme->border_width, 0);
+               subtree->tree = wlr_scene_tree_create(view->ssd.tree);
+               parent = subtree->tree;
+               wlr_scene_node_set_position(&parent->node, -theme->border_width, 0);
                if (subtree == &view->ssd.border.active) {
                        color = theme->window_active_border_color;
                } else {
                        color = theme->window_inactive_border_color;
-                       wlr_scene_node_set_enabled(parent, false);
+                       wlr_scene_node_set_enabled(&parent->node, false);
                }
                wl_list_init(&subtree->parts);
                add_scene_rect(&subtree->parts, LAB_SSD_PART_LEFT, parent,
index a0783eaed3d69418c76fbd85e7e6f029b5802f59..df1c5f45c697e91705cb71075a399e7867bd9133 100644 (file)
@@ -7,7 +7,7 @@
 
 static struct ssd_part *
 add_extent(struct wl_list *part_list, enum ssd_part_type type,
-               struct wlr_scene_node *parent)
+               struct wlr_scene_tree *parent)
 {
        float invisible[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
        struct ssd_part *part = add_scene_part(part_list, type);
@@ -40,13 +40,14 @@ ssd_extents_create(struct view *view)
        int extended_area = EXTENDED_AREA;
        int corner_size = extended_area + theme->border_width + BUTTON_WIDTH / 2;
 
-       view->ssd.extents.tree = wlr_scene_tree_create(&view->ssd.tree->node);
-       struct wlr_scene_node *parent = &view->ssd.extents.tree->node;
+       view->ssd.extents.tree = wlr_scene_tree_create(view->ssd.tree);
+       struct wlr_scene_tree *parent = view->ssd.extents.tree;
        if (view->maximized || view->fullscreen) {
-               wlr_scene_node_set_enabled(parent, false);
+               wlr_scene_node_set_enabled(&parent->node, false);
        }
        wl_list_init(&view->ssd.extents.parts);
-       wlr_scene_node_set_position(parent, -(theme->border_width + extended_area),
+       wlr_scene_node_set_position(&parent->node,
+               -(theme->border_width + extended_area),
                -(theme->title_height + theme->border_width + extended_area));
 
        /* Initialize parts and set constant values for targeted geometry */
index f7c4c51daaa02e0a57f250c3558eaf0445076f79..ddd090149f40578176cd81fbbeb34480bc78663e 100644 (file)
@@ -15,7 +15,7 @@ add_scene_part(struct wl_list *part_list, enum ssd_part_type type)
 
 struct ssd_part *
 add_scene_rect(struct wl_list *list, enum ssd_part_type type,
-       struct wlr_scene_node *parent, int width, int height,
+       struct wlr_scene_tree *parent, int width, int height,
        int x, int y, float color[4])
 {
        /*
@@ -36,7 +36,7 @@ add_scene_rect(struct wl_list *list, enum ssd_part_type type,
 
 struct ssd_part *
 add_scene_buffer(struct wl_list *list, enum ssd_part_type type,
-       struct wlr_scene_node *parent, struct wlr_buffer *buffer,
+       struct wlr_scene_tree *parent, struct wlr_buffer *buffer,
        int x, int y)
 {
        struct ssd_part *part = add_scene_part(list, type);
@@ -47,7 +47,7 @@ add_scene_buffer(struct wl_list *list, enum ssd_part_type type,
 
 static void
 finish_scene_button(struct wl_list *part_list, enum ssd_part_type type,
-       struct wlr_scene_node *parent, struct wlr_buffer *icon_buffer)
+       struct wlr_scene_tree *parent, struct wlr_buffer *icon_buffer)
 {
        float hover_bg[4] = {0.15f, 0.15f, 0.15f, 0.3f};
 
@@ -65,12 +65,12 @@ finish_scene_button(struct wl_list *part_list, enum ssd_part_type type,
 
 struct ssd_part *
 add_scene_button_corner(struct wl_list *part_list, enum ssd_part_type type,
-       struct wlr_scene_node *parent, struct wlr_buffer *corner_buffer,
+       struct wlr_scene_tree *parent, struct wlr_buffer *corner_buffer,
        struct wlr_buffer *icon_buffer, int x)
 {
        struct ssd_part *button_root = add_scene_part(part_list, type);
-       parent = &wlr_scene_tree_create(parent)->node;
-       button_root->node = parent;
+       parent = wlr_scene_tree_create(parent);
+       button_root->node = &parent->node;
        wlr_scene_node_set_position(button_root->node, x, 0);
 
        int offset_x;
@@ -95,12 +95,12 @@ add_scene_button_corner(struct wl_list *part_list, enum ssd_part_type type,
 
 struct ssd_part *
 add_scene_button(struct wl_list *part_list, enum ssd_part_type type,
-       struct wlr_scene_node *parent, float *bg_color,
+       struct wlr_scene_tree *parent, float *bg_color,
        struct wlr_buffer *icon_buffer, int x)
 {
        struct ssd_part *button_root = add_scene_part(part_list, type);
-       parent = &wlr_scene_tree_create(parent)->node;
-       button_root->node = parent;
+       parent = wlr_scene_tree_create(parent);
+       button_root->node = &parent->node;
        wlr_scene_node_set_position(button_root->node, x, 0);
 
        struct ssd_part *part;
index d9931372f5b4df791c6f52213cd971db6c7aab3c..8f98d5192fa34b365d3d51e249ab6eaa1fbeb564 100644 (file)
@@ -20,15 +20,15 @@ ssd_titlebar_create(struct view *view)
        int width = view->w;
 
        float *color;
-       struct wlr_scene_node *parent;
+       struct wlr_scene_tree *parent;
        struct wlr_buffer *corner_top_left;
        struct wlr_buffer *corner_top_right;
 
        struct ssd_sub_tree *subtree;
        FOR_EACH_STATE(view, subtree) {
-               subtree->tree = wlr_scene_tree_create(&view->ssd.tree->node);
-               parent = &subtree->tree->node;
-               wlr_scene_node_set_position(parent, 0, -theme->title_height);
+               subtree->tree = wlr_scene_tree_create(view->ssd.tree);
+               parent = subtree->tree;
+               wlr_scene_node_set_position(&parent->node, 0, -theme->title_height);
                if (subtree == &view->ssd.titlebar.active) {
                        color = theme->window_active_title_bg_color;
                        corner_top_left = &theme->corner_top_left_active_normal->base;
@@ -37,7 +37,7 @@ ssd_titlebar_create(struct view *view)
                        color = theme->window_inactive_title_bg_color;
                        corner_top_left = &theme->corner_top_left_inactive_normal->base;
                        corner_top_right = &theme->corner_top_right_inactive_normal->base;
-                       wlr_scene_node_set_enabled(parent, false);
+                       wlr_scene_node_set_enabled(&parent->node, false);
                }
                wl_list_init(&subtree->parts);
 
@@ -65,7 +65,7 @@ ssd_titlebar_create(struct view *view)
 static bool
 is_direct_child(struct wlr_scene_node *node, struct ssd_sub_tree *subtree)
 {
-       return node->parent == &subtree->tree->node;
+       return node->parent == subtree->tree;
 }
 
 void
@@ -241,7 +241,7 @@ ssd_update_title(struct view *view)
                if (!part) {
                        /* Initialize part and wlr_scene_buffer without attaching a buffer */
                        part = add_scene_part(&subtree->parts, LAB_SSD_PART_TITLE);
-                       part->node = &wlr_scene_buffer_create(&subtree->tree->node, NULL)->node;
+                       part->node = &wlr_scene_buffer_create(subtree->tree, NULL)->node;
                }
 
                /* Generate and update the lab_data_buffer, drops the old buffer */
index c8ee96a43fbca0c50793dca952ecf060fbebe2d4..5844146d6af379872e4c880fdf988e540748947c 100644 (file)
@@ -328,7 +328,7 @@ static bool
 is_always_on_top(struct view *view)
 {
        return view->scene_tree->node.parent ==
-               &view->server->view_tree_always_on_top->node;
+               view->server->view_tree_always_on_top;
 }
 
 void
@@ -336,10 +336,10 @@ view_toggle_always_on_top(struct view *view)
 {
        if (is_always_on_top(view)) {
                wlr_scene_node_reparent(&view->scene_tree->node,
-                       &view->server->view_tree->node);
+                       view->server->view_tree);
        } else {
                wlr_scene_node_reparent(&view->scene_tree->node,
-                       &view->server->view_tree_always_on_top->node);
+                       view->server->view_tree_always_on_top);
        }
 }
 
index e5050fa1d3e4e53953b4eff546e4fd6165274a85..3c92d609c320529c9c1013d703494de13b4c6ea1 100644 (file)
@@ -91,9 +91,9 @@ xdg_popup_create(struct view *view, struct wlr_xdg_popup *wlr_popup)
        }
        struct wlr_xdg_surface *parent =
                wlr_xdg_surface_from_wlr_surface(wlr_popup->parent);
-       struct wlr_scene_node *parent_node = parent->surface->data;
+       struct wlr_scene_tree *parent_tree = parent->surface->data;
        wlr_popup->base->surface->data =
-               wlr_scene_xdg_surface_create(parent_node, wlr_popup->base);
+               wlr_scene_xdg_surface_create(parent_tree, wlr_popup->base);
        node_descriptor_create(wlr_popup->base->surface->data,
                LAB_NODE_DESC_XDG_POPUP, view);
 
index afae218ce3e479c0e5d085b60d1649287ee35262..162a6d41ed78fd9ddcc9a17c348a74f460ac79a8 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -348,7 +348,7 @@ static const struct view_impl xdg_toplevel_view_impl = {
  * We use the following struct user_data pointers:
  *   - wlr_xdg_surface->data = view
  *     for the wlr_xdg_toplevel_decoration_v1 implementation
- *   - wlr_surface->data = scene_node
+ *   - wlr_surface->data = scene_tree
  *     to help the popups find their parent nodes
  */
 void
@@ -374,16 +374,17 @@ xdg_surface_new(struct wl_listener *listener, void *data)
        view->impl = &xdg_toplevel_view_impl;
        view->xdg_surface = xdg_surface;
 
-       view->scene_tree = wlr_scene_tree_create(&view->server->view_tree->node);
+       view->scene_tree = wlr_scene_tree_create(view->server->view_tree);
        wlr_scene_node_set_enabled(&view->scene_tree->node, false);
 
-       view->scene_node = wlr_scene_xdg_surface_create(
-               &view->scene_tree->node, view->xdg_surface);
-       if (!view->scene_node) {
+       struct wlr_scene_tree *tree = wlr_scene_xdg_surface_create(
+               view->scene_tree, view->xdg_surface);
+       if (!tree) {
                /* TODO: might need further clean up */
                wl_resource_post_no_memory(view->surface->resource);
                return;
        }
+       view->scene_node = &tree->node;
        node_descriptor_create(&view->scene_tree->node,
                LAB_NODE_DESC_VIEW, view);
 
@@ -391,7 +392,7 @@ xdg_surface_new(struct wl_listener *listener, void *data)
        xdg_surface->data = view;
 
        /* In support of xdg popups */
-       xdg_surface->surface->data = view->scene_node;
+       xdg_surface->surface->data = tree;
 
        view->map.notify = handle_map;
        wl_signal_add(&xdg_surface->events.map, &view->map);
index 5014e61040cb4225ef09c55a92b977aa2a3a67ba..68fe4a0ac2e1e70b61621b8791a6c655760a26a8 100644 (file)
@@ -60,7 +60,7 @@ unmanaged_handle_map(struct wl_listener *listener, void *data)
 
        /* node will be destroyed automatically once surface is destroyed */
        struct wlr_scene_node *node = &wlr_scene_surface_create(
-                       &unmanaged->server->unmanaged_tree->node,
+                       unmanaged->server->unmanaged_tree,
                        xsurface->surface)->buffer->node;
        wlr_scene_node_set_position(node, unmanaged->lx, unmanaged->ly);
 }
index 8f1b76333f23bdaea0bdaeccebaddfcc12cd4d9d..2790852d6d0e44e0299230a97e159819b1dfe27d 100644 (file)
@@ -311,13 +311,14 @@ map(struct view *view)
 
        if (view->surface != view->xwayland_surface->surface) {
                view->surface = view->xwayland_surface->surface;
-               view->scene_node = wlr_scene_subsurface_tree_create(
-                       &view->scene_tree->node, view->surface);
-               if (!view->scene_node) {
+               struct wlr_scene_tree *tree = wlr_scene_subsurface_tree_create(
+                       view->scene_tree, view->surface);
+               if (!tree) {
                        /* TODO: might need further clean up */
                        wl_resource_post_no_memory(view->surface->resource);
                        return;
                }
+               view->scene_node = &tree->node;
        }
 
        if (!view->toplevel_handle) {
@@ -433,7 +434,7 @@ xwayland_surface_new(struct wl_listener *listener, void *data)
        view->impl = &xwl_view_impl;
        view->xwayland_surface = xsurface;
 
-       view->scene_tree = wlr_scene_tree_create(&view->server->view_tree->node);
+       view->scene_tree = wlr_scene_tree_create(view->server->view_tree);
        node_descriptor_create(&view->scene_tree->node,
                LAB_NODE_DESC_VIEW, view);
        xsurface->data = view;
index be6c191def46a9f0db87dba5227ffa2be99d790e..c954182421fdaf1bf2625fac7292403cda73c783 100644 (file)
@@ -1,6 +1,6 @@
 [wrap-git]
 url = https://gitlab.freedesktop.org/wlroots/wlroots.git
-revision = 9eb71146ae56c509ee33c7e8a662549592aad870
+revision = ccd0f85c2a36308e35b153c7f9653abac7659af3
 
 [provide]
 dependency_names = wlroots