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;
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 */
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) {
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);
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;
}
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");
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 =
}
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;
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;
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);
}
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
.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;
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;
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;
}
}
/* 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;
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;
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);
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);
}
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;
}
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);
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,
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);
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 */
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])
{
/*
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);
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};
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;
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;
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;
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);
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
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 */
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
{
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);
}
}
}
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);
* 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
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);
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);
/* 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);
}
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) {
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;
[wrap-git]
url = https://gitlab.freedesktop.org/wlroots/wlroots.git
-revision = 9eb71146ae56c509ee33c7e8a662549592aad870
+revision = ccd0f85c2a36308e35b153c7f9653abac7659af3
[provide]
dependency_names = wlroots