Chase wlroots: every scene_node parent is now a tree

Chases wlroots ccd0f85c2a36308e35b153c7f9653abac7659af3
wlr_scene: Only allow parenting on a wlr_scene_tree
This commit is contained in:
Consolatis 2022-06-05 15:17:35 +02:00 committed by Johan Malm
parent b7c9d0e055
commit 2ed7a10779
20 changed files with 97 additions and 93 deletions

View 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;

View 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 */

View 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);

View 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");

View 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;

View 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;

View file

@ -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;

View 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);

View 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);

View 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);

View 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,

View 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 */

View 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;

View 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 */

View 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);
}
}

View 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);

View file

@ -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);

View 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);
}

View 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;

View file

@ -1,6 +1,6 @@
[wrap-git]
url = https://gitlab.freedesktop.org/wlroots/wlroots.git
revision = 9eb71146ae56c509ee33c7e8a662549592aad870
revision = ccd0f85c2a36308e35b153c7f9653abac7659af3
[provide]
dependency_names = wlroots