From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Sun, 5 Jun 2022 13:17:35 +0000 (+0200) Subject: Chase wlroots: every scene_node parent is now a tree X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=2ed7a10779b2405f540e59598bc54d6f48fee1b7;p=proto%2Flabwc.git Chase wlroots: every scene_node parent is now a tree Chases wlroots ccd0f85c2a36308e35b153c7f9653abac7659af3 wlr_scene: Only allow parenting on a wlr_scene_tree --- diff --git a/include/layers.h b/include/layers.h index b40c0cac..3bc07c2b 100644 --- a/include/layers.h +++ b/include/layers.h @@ -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; diff --git a/include/ssd.h b/include/ssd.h index e3feee0a..69b82c99 100644 --- a/include/ssd.h +++ b/include/ssd.h @@ -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 */ diff --git a/src/debug.c b/src/debug.c index 510bb0a6..a22e633d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -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); diff --git a/src/desktop.c b/src/desktop.c index 933d71b7..3ad77207 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -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"); diff --git a/src/layers.c b/src/layers.c index 9d18e23d..1a93d691 100644 --- a/src/layers.c +++ b/src/layers.c @@ -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; diff --git a/src/menu/menu.c b/src/menu/menu.c index 374ea295..d4ad30df 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -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; diff --git a/src/osd.c b/src/osd.c index e946afc5..29fa07ec 100644 --- 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; diff --git a/src/output.c b/src/output.c index 757afcca..7f6ac9af 100644 --- a/src/output.c +++ b/src/output.c @@ -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); diff --git a/src/server.c b/src/server.c index 1e85730d..7ad7c427 100644 --- a/src/server.c +++ b/src/server.c @@ -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); diff --git a/src/ssd/ssd.c b/src/ssd/ssd.c index d10aabca..c60048f7 100644 --- a/src/ssd/ssd.c +++ b/src/ssd/ssd.c @@ -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); diff --git a/src/ssd/ssd_border.c b/src/ssd/ssd_border.c index 01c1869f..719012c2 100644 --- a/src/ssd/ssd_border.c +++ b/src/ssd/ssd_border.c @@ -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, diff --git a/src/ssd/ssd_extents.c b/src/ssd/ssd_extents.c index a0783eae..df1c5f45 100644 --- a/src/ssd/ssd_extents.c +++ b/src/ssd/ssd_extents.c @@ -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 */ diff --git a/src/ssd/ssd_part.c b/src/ssd/ssd_part.c index f7c4c51d..ddd09014 100644 --- a/src/ssd/ssd_part.c +++ b/src/ssd/ssd_part.c @@ -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; diff --git a/src/ssd/ssd_titlebar.c b/src/ssd/ssd_titlebar.c index d9931372..8f98d519 100644 --- a/src/ssd/ssd_titlebar.c +++ b/src/ssd/ssd_titlebar.c @@ -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 */ diff --git a/src/view.c b/src/view.c index c8ee96a4..5844146d 100644 --- a/src/view.c +++ b/src/view.c @@ -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); } } diff --git a/src/xdg-popup.c b/src/xdg-popup.c index e5050fa1..3c92d609 100644 --- a/src/xdg-popup.c +++ b/src/xdg-popup.c @@ -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); diff --git a/src/xdg.c b/src/xdg.c index afae218c..162a6d41 100644 --- 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); diff --git a/src/xwayland-unmanaged.c b/src/xwayland-unmanaged.c index 5014e610..68fe4a0a 100644 --- a/src/xwayland-unmanaged.c +++ b/src/xwayland-unmanaged.c @@ -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); } diff --git a/src/xwayland.c b/src/xwayland.c index 8f1b7633..2790852d 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -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; diff --git a/subprojects/wlroots.wrap b/subprojects/wlroots.wrap index be6c191d..c9541824 100644 --- a/subprojects/wlroots.wrap +++ b/subprojects/wlroots.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://gitlab.freedesktop.org/wlroots/wlroots.git -revision = 9eb71146ae56c509ee33c7e8a662549592aad870 +revision = ccd0f85c2a36308e35b153c7f9653abac7659af3 [provide] dependency_names = wlroots