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 lab_layer_popup {
struct wlr_xdg_popup *wlr_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 */ /* To simplify moving popup nodes from the bottom to the top layer */
struct wlr_box output_toplevel_sx_box; 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 wl_list *part_list, enum ssd_part_type type);
struct ssd_part *add_scene_rect( struct ssd_part *add_scene_rect(
struct wl_list *list, enum ssd_part_type type, 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]); float color[4]);
struct ssd_part *add_scene_buffer( struct ssd_part *add_scene_buffer(
struct wl_list *list, enum ssd_part_type type, 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 ssd_part *add_scene_button(
struct wl_list *part_list, enum ssd_part_type type, 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 wlr_buffer *icon_buffer, int x);
struct ssd_part *add_scene_button_corner( struct ssd_part *add_scene_button_corner(
struct wl_list *part_list, enum ssd_part_type type, 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 wlr_buffer *icon_buffer, int x);
/* SSD internal helpers */ /* 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) { if (node == &server->menu_tree->node) {
return "server->menu_tree"; return "server->menu_tree";
} }
if (node->parent == &server->scene->tree.node) { if (node->parent == &server->scene->tree) {
struct output *output; struct output *output;
wl_list_for_each(output, &server->outputs, link) { wl_list_for_each(output, &server->outputs, link) {
if (node == &output->osd_tree->node) { 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) { if (node == &server->view_tree_always_on_top->node) {
return "server->view_tree_always_on_top"; return "server->view_tree_always_on_top";
} }
if (node->parent == &server->view_tree->node || if (node->parent == server->view_tree ||
node->parent == &server->view_tree_always_on_top->node) { node->parent == server->view_tree_always_on_top) {
*last_view = node_view_from_node(node);
*last_view = node_view_from_node(node); *last_view = node_view_from_node(node);
} }
const char *view_part = get_view_part(*last_view, 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; return NULL;
} }
#if HAVE_XWAYLAND #if HAVE_XWAYLAND
if (node->parent == &server->unmanaged_tree->node) { if (node->parent == server->unmanaged_tree) {
*view_area = LAB_SSD_UNMANAGED; *view_area = LAB_SSD_UNMANAGED;
return NULL; return NULL;
} }
@ -311,7 +311,8 @@ desktop_node_and_view_at(struct server *server, double lx, double ly,
return NULL; return NULL;
} }
} }
node = node->parent; /* node->parent is always a *wlr_scene_tree */
node = node->parent ? &node->parent->node : NULL;
} }
if (!node) { if (!node) {
wlr_log(WLR_ERROR, "Unknown node detected"); 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 void popup_handle_new_popup(struct wl_listener *listener, void *data);
static struct lab_layer_popup * 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 wlr_box *output_toplevel_sx_box)
{ {
struct lab_layer_popup *popup = 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->wlr_popup = wlr_popup;
popup->scene_node = popup->scene_tree =
wlr_scene_xdg_surface_create(parent, wlr_popup->base); wlr_scene_xdg_surface_create(parent, wlr_popup->base);
if (!popup->scene_node) { if (!popup->scene_tree) {
free(popup); free(popup);
return NULL; return NULL;
} }
node_descriptor_create(popup->scene_node, node_descriptor_create(&popup->scene_tree->node,
LAB_NODE_DESC_LAYER_POPUP, popup); LAB_NODE_DESC_LAYER_POPUP, popup);
popup->destroy.notify = popup_handle_destroy; 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); wl_container_of(listener, lab_layer_popup, new_popup);
struct wlr_xdg_popup *wlr_popup = data; struct wlr_xdg_popup *wlr_popup = data;
struct lab_layer_popup *new_popup = create_popup(wlr_popup, 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); &lab_layer_popup->output_toplevel_sx_box);
new_popup->output_toplevel_sx_box = new_popup->output_toplevel_sx_box =
lab_layer_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 output *output = output_from_wlr_output(server, wlr_output);
struct wlr_box box = { 0 }; struct wlr_box box = { 0 };
wlr_output_layout_get_box(server->output_layout, wlr_output, &box); wlr_output_layout_get_box(server->output_layout, wlr_output, &box);
int lx = toplevel->scene_layer_surface->node->state.x + box.x; int lx = toplevel->scene_layer_surface->tree->node.state.x + box.x;
int ly = toplevel->scene_layer_surface->node->state.y + box.y; int ly = toplevel->scene_layer_surface->tree->node.state.y + box.y;
struct wlr_scene_node *node = popup->scene_node; struct wlr_scene_node *node = &popup->scene_tree->node;
wlr_scene_node_reparent(node, &output->layer_popup_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); 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); output->wlr_output, &output_box);
int lx, ly; 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 * 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, .height = output_box.height,
}; };
struct lab_layer_popup *popup = create_popup(wlr_popup, struct lab_layer_popup *popup = create_popup(wlr_popup,
toplevel->scene_layer_surface->node, toplevel->scene_layer_surface->tree,
&output_toplevel_sx_box); &output_toplevel_sx_box);
popup->output_toplevel_sx_box = 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]; output->layer_tree[layer_surface->current.layer];
surface->scene_layer_surface = wlr_scene_layer_surface_v1_create( surface->scene_layer_surface = wlr_scene_layer_surface_v1_create(
&selected_layer->node, layer_surface); selected_layer, layer_surface);
if (!surface->scene_layer_surface) { if (!surface->scene_layer_surface) {
wlr_layer_surface_v1_destroy(layer_surface); wlr_layer_surface_v1_destroy(layer_surface);
wlr_log(WLR_ERROR, "could not create layer surface"); wlr_log(WLR_ERROR, "could not create layer surface");
return; return;
} }
node_descriptor_create(surface->scene_layer_surface->node, node_descriptor_create(&surface->scene_layer_surface->tree->node,
LAB_NODE_DESC_LAYER_SURFACE, surface); LAB_NODE_DESC_LAYER_SURFACE, surface);
surface->server = server; surface->server = server;

View file

@ -54,7 +54,7 @@ menu_create(struct server *server, const char *id, const char *label)
menu->server = server; menu->server = server;
menu->size.width = MENUWIDTH; menu->size.width = MENUWIDTH;
/* menu->size.height will be kept up to date by adding items */ /* 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); wlr_scene_node_set_enabled(&menu->scene_tree->node, false);
return menu; return menu;
} }
@ -117,29 +117,29 @@ item_create(struct menu *menu, const char *text)
} }
/* Menu item root node */ /* 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, node_descriptor_create(&menuitem->tree->node,
LAB_NODE_DESC_MENUITEM, menuitem); LAB_NODE_DESC_MENUITEM, menuitem);
/* Tree for each state to hold background and text buffer */ /* Tree for each state to hold background and text buffer */
menuitem->normal.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->node); menuitem->selected.tree = wlr_scene_tree_create(menuitem->tree);
/* Item background nodes */ /* Item background nodes */
menuitem->normal.background = &wlr_scene_rect_create( menuitem->normal.background = &wlr_scene_rect_create(
&menuitem->normal.tree->node, menuitem->normal.tree,
MENUWIDTH, menu->item_height, MENUWIDTH, menu->item_height,
theme->menu_items_bg_color)->node; theme->menu_items_bg_color)->node;
menuitem->selected.background = &wlr_scene_rect_create( menuitem->selected.background = &wlr_scene_rect_create(
&menuitem->selected.tree->node, menuitem->selected.tree,
MENUWIDTH, menu->item_height, MENUWIDTH, menu->item_height,
theme->menu_items_active_bg_color)->node; theme->menu_items_active_bg_color)->node;
/* Font nodes */ /* Font nodes */
menuitem->normal.text = &wlr_scene_buffer_create( 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.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 */ /* Center font nodes */
y = (menu->item_height - menuitem->normal.buffer->base.height) / 2; 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); cairo_surface_flush(surf);
struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_create( 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 */ /* Center OSD */
struct wlr_box output_box; 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++) { for (int i = 0; i < nr_layers; i++) {
wl_list_init(&output->layers[i]); wl_list_init(&output->layers[i]);
output->layer_tree[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, node_descriptor_create(&output->layer_tree[i]->node,
LAB_NODE_DESC_TREE, NULL); 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, node_descriptor_create(&output->layer_popup_tree->node,
LAB_NODE_DESC_TREE, NULL); 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, node_descriptor_create(&output->osd_tree->node,
LAB_NODE_DESC_TREE, NULL); LAB_NODE_DESC_TREE, NULL);

View file

@ -238,12 +238,12 @@ server_init(struct server *server)
wlr_log(WLR_ERROR, "unable to create scene"); wlr_log(WLR_ERROR, "unable to create scene");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
server->view_tree = 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.node); server->view_tree_always_on_top = wlr_scene_tree_create(&server->scene->tree);
#if HAVE_XWAYLAND #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 #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); 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 wl_list *part_list = NULL;
struct wlr_scene_node *grandparent = struct wlr_scene_tree *grandparent =
node->parent ? node->parent->parent : NULL; node->parent ? node->parent->node.parent : NULL;
/* active titlebar */ /* 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; 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; part_list = &view->ssd.titlebar.active.parts;
/* extents */ /* extents */
} else if (node->parent == &view->ssd.extents.tree->node) { } else if (node->parent == view->ssd.extents.tree) {
part_list = &view->ssd.extents.parts; part_list = &view->ssd.extents.parts;
/* active border */ /* 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; part_list = &view->ssd.border.active.parts;
/* inactive titlebar */ /* 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; 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; part_list = &view->ssd.titlebar.inactive.parts;
/* inactive border */ /* 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; part_list = &view->ssd.border.inactive.parts;
} }
@ -154,7 +154,7 @@ ssd_create(struct view *view)
return; 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); wlr_scene_node_lower_to_bottom(&view->ssd.tree->node);
ssd_extents_create(view); ssd_extents_create(view);
ssd_border_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; int full_width = width + 2 * theme->border_width;
float *color; float *color;
struct wlr_scene_node *parent; struct wlr_scene_tree *parent;
struct ssd_sub_tree *subtree; struct ssd_sub_tree *subtree;
FOR_EACH_STATE(view, subtree) { FOR_EACH_STATE(view, subtree) {
subtree->tree = wlr_scene_tree_create(&view->ssd.tree->node); subtree->tree = wlr_scene_tree_create(view->ssd.tree);
parent = &subtree->tree->node; parent = subtree->tree;
wlr_scene_node_set_position(parent, -theme->border_width, 0); wlr_scene_node_set_position(&parent->node, -theme->border_width, 0);
if (subtree == &view->ssd.border.active) { if (subtree == &view->ssd.border.active) {
color = theme->window_active_border_color; color = theme->window_active_border_color;
} else { } else {
color = theme->window_inactive_border_color; 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); wl_list_init(&subtree->parts);
add_scene_rect(&subtree->parts, LAB_SSD_PART_LEFT, parent, add_scene_rect(&subtree->parts, LAB_SSD_PART_LEFT, parent,

View file

@ -7,7 +7,7 @@
static struct ssd_part * static struct ssd_part *
add_extent(struct wl_list *part_list, enum ssd_part_type type, 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 }; float invisible[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
struct ssd_part *part = add_scene_part(part_list, type); 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 extended_area = EXTENDED_AREA;
int corner_size = extended_area + theme->border_width + BUTTON_WIDTH / 2; int corner_size = extended_area + theme->border_width + BUTTON_WIDTH / 2;
view->ssd.extents.tree = wlr_scene_tree_create(&view->ssd.tree->node); view->ssd.extents.tree = wlr_scene_tree_create(view->ssd.tree);
struct wlr_scene_node *parent = &view->ssd.extents.tree->node; struct wlr_scene_tree *parent = view->ssd.extents.tree;
if (view->maximized || view->fullscreen) { 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); 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)); -(theme->title_height + theme->border_width + extended_area));
/* Initialize parts and set constant values for targeted geometry */ /* 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 * struct ssd_part *
add_scene_rect(struct wl_list *list, enum ssd_part_type type, 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]) 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 * struct ssd_part *
add_scene_buffer(struct wl_list *list, enum ssd_part_type type, 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) int x, int y)
{ {
struct ssd_part *part = add_scene_part(list, type); 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 static void
finish_scene_button(struct wl_list *part_list, enum ssd_part_type type, 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}; 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 * struct ssd_part *
add_scene_button_corner(struct wl_list *part_list, enum ssd_part_type type, 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 wlr_buffer *icon_buffer, int x)
{ {
struct ssd_part *button_root = add_scene_part(part_list, type); struct ssd_part *button_root = add_scene_part(part_list, type);
parent = &wlr_scene_tree_create(parent)->node; parent = wlr_scene_tree_create(parent);
button_root->node = parent; button_root->node = &parent->node;
wlr_scene_node_set_position(button_root->node, x, 0); wlr_scene_node_set_position(button_root->node, x, 0);
int offset_x; int offset_x;
@ -95,12 +95,12 @@ add_scene_button_corner(struct wl_list *part_list, enum ssd_part_type type,
struct ssd_part * struct ssd_part *
add_scene_button(struct wl_list *part_list, enum ssd_part_type type, 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 wlr_buffer *icon_buffer, int x)
{ {
struct ssd_part *button_root = add_scene_part(part_list, type); struct ssd_part *button_root = add_scene_part(part_list, type);
parent = &wlr_scene_tree_create(parent)->node; parent = wlr_scene_tree_create(parent);
button_root->node = parent; button_root->node = &parent->node;
wlr_scene_node_set_position(button_root->node, x, 0); wlr_scene_node_set_position(button_root->node, x, 0);
struct ssd_part *part; struct ssd_part *part;

View file

@ -20,15 +20,15 @@ ssd_titlebar_create(struct view *view)
int width = view->w; int width = view->w;
float *color; float *color;
struct wlr_scene_node *parent; struct wlr_scene_tree *parent;
struct wlr_buffer *corner_top_left; struct wlr_buffer *corner_top_left;
struct wlr_buffer *corner_top_right; struct wlr_buffer *corner_top_right;
struct ssd_sub_tree *subtree; struct ssd_sub_tree *subtree;
FOR_EACH_STATE(view, subtree) { FOR_EACH_STATE(view, subtree) {
subtree->tree = wlr_scene_tree_create(&view->ssd.tree->node); subtree->tree = wlr_scene_tree_create(view->ssd.tree);
parent = &subtree->tree->node; parent = subtree->tree;
wlr_scene_node_set_position(parent, 0, -theme->title_height); wlr_scene_node_set_position(&parent->node, 0, -theme->title_height);
if (subtree == &view->ssd.titlebar.active) { if (subtree == &view->ssd.titlebar.active) {
color = theme->window_active_title_bg_color; color = theme->window_active_title_bg_color;
corner_top_left = &theme->corner_top_left_active_normal->base; 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; color = theme->window_inactive_title_bg_color;
corner_top_left = &theme->corner_top_left_inactive_normal->base; corner_top_left = &theme->corner_top_left_inactive_normal->base;
corner_top_right = &theme->corner_top_right_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); wl_list_init(&subtree->parts);
@ -65,7 +65,7 @@ ssd_titlebar_create(struct view *view)
static bool static bool
is_direct_child(struct wlr_scene_node *node, struct ssd_sub_tree *subtree) 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 void
@ -241,7 +241,7 @@ ssd_update_title(struct view *view)
if (!part) { if (!part) {
/* Initialize part and wlr_scene_buffer without attaching a buffer */ /* Initialize part and wlr_scene_buffer without attaching a buffer */
part = add_scene_part(&subtree->parts, LAB_SSD_PART_TITLE); 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 */ /* 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) is_always_on_top(struct view *view)
{ {
return view->scene_tree->node.parent == return view->scene_tree->node.parent ==
&view->server->view_tree_always_on_top->node; view->server->view_tree_always_on_top;
} }
void void
@ -336,10 +336,10 @@ view_toggle_always_on_top(struct view *view)
{ {
if (is_always_on_top(view)) { if (is_always_on_top(view)) {
wlr_scene_node_reparent(&view->scene_tree->node, wlr_scene_node_reparent(&view->scene_tree->node,
&view->server->view_tree->node); view->server->view_tree);
} else { } else {
wlr_scene_node_reparent(&view->scene_tree->node, 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 = struct wlr_xdg_surface *parent =
wlr_xdg_surface_from_wlr_surface(wlr_popup->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_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, node_descriptor_create(wlr_popup->base->surface->data,
LAB_NODE_DESC_XDG_POPUP, view); 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: * We use the following struct user_data pointers:
* - wlr_xdg_surface->data = view * - wlr_xdg_surface->data = view
* for the wlr_xdg_toplevel_decoration_v1 implementation * 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 * to help the popups find their parent nodes
*/ */
void void
@ -374,16 +374,17 @@ xdg_surface_new(struct wl_listener *listener, void *data)
view->impl = &xdg_toplevel_view_impl; view->impl = &xdg_toplevel_view_impl;
view->xdg_surface = xdg_surface; 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); wlr_scene_node_set_enabled(&view->scene_tree->node, false);
view->scene_node = wlr_scene_xdg_surface_create( struct wlr_scene_tree *tree = wlr_scene_xdg_surface_create(
&view->scene_tree->node, view->xdg_surface); view->scene_tree, view->xdg_surface);
if (!view->scene_node) { if (!tree) {
/* TODO: might need further clean up */ /* TODO: might need further clean up */
wl_resource_post_no_memory(view->surface->resource); wl_resource_post_no_memory(view->surface->resource);
return; return;
} }
view->scene_node = &tree->node;
node_descriptor_create(&view->scene_tree->node, node_descriptor_create(&view->scene_tree->node,
LAB_NODE_DESC_VIEW, view); LAB_NODE_DESC_VIEW, view);
@ -391,7 +392,7 @@ xdg_surface_new(struct wl_listener *listener, void *data)
xdg_surface->data = view; xdg_surface->data = view;
/* In support of xdg popups */ /* In support of xdg popups */
xdg_surface->surface->data = view->scene_node; xdg_surface->surface->data = tree;
view->map.notify = handle_map; view->map.notify = handle_map;
wl_signal_add(&xdg_surface->events.map, &view->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 */ /* node will be destroyed automatically once surface is destroyed */
struct wlr_scene_node *node = &wlr_scene_surface_create( struct wlr_scene_node *node = &wlr_scene_surface_create(
&unmanaged->server->unmanaged_tree->node, unmanaged->server->unmanaged_tree,
xsurface->surface)->buffer->node; xsurface->surface)->buffer->node;
wlr_scene_node_set_position(node, unmanaged->lx, unmanaged->ly); 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) { if (view->surface != view->xwayland_surface->surface) {
view->surface = view->xwayland_surface->surface; view->surface = view->xwayland_surface->surface;
view->scene_node = wlr_scene_subsurface_tree_create( struct wlr_scene_tree *tree = wlr_scene_subsurface_tree_create(
&view->scene_tree->node, view->surface); view->scene_tree, view->surface);
if (!view->scene_node) { if (!tree) {
/* TODO: might need further clean up */ /* TODO: might need further clean up */
wl_resource_post_no_memory(view->surface->resource); wl_resource_post_no_memory(view->surface->resource);
return; return;
} }
view->scene_node = &tree->node;
} }
if (!view->toplevel_handle) { if (!view->toplevel_handle) {
@ -433,7 +434,7 @@ xwayland_surface_new(struct wl_listener *listener, void *data)
view->impl = &xwl_view_impl; view->impl = &xwl_view_impl;
view->xwayland_surface = xsurface; 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, node_descriptor_create(&view->scene_tree->node,
LAB_NODE_DESC_VIEW, view); LAB_NODE_DESC_VIEW, view);
xsurface->data = view; xsurface->data = view;

View file

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