{
struct wlr_scene_node *node;
wl_list_for_each(node, &tree->children, link) {
+ /*
+ * Could be null during destruction when called from
+ * handle_node_destroy()
+ */
+ if (!node->data) {
+ continue;
+ }
struct lab_layer_surface *surface = node_layer_surface_from_node(node);
struct wlr_scene_layer_surface_v1 *scene = surface->scene_layer_surface;
if (!scene->layer_surface->initialized) {
struct lab_layer_surface *layer =
wl_container_of(listener, layer, output_destroy);
layer->scene_layer_surface->layer_surface->output = NULL;
+ layer->output = NULL;
wlr_layer_surface_v1_destroy(layer->scene_layer_surface->layer_surface);
}
* focus to.
*/
+ /*
+ * Nullify node descriptor early to avoid functions such as
+ * arrange_one_layer() trying to dereference it.
+ */
+ layer->tree->node.data = NULL;
+
+ if (layer->output) {
+ output_update_usable_area(layer->output);
+ }
+
wl_list_remove(&layer->map.link);
wl_list_remove(&layer->unmap.link);
wl_list_remove(&layer->surface_commit.link);
struct lab_layer_surface *layer = wl_container_of(listener, layer, unmap);
struct wlr_layer_surface_v1 *layer_surface =
layer->scene_layer_surface->layer_surface;
- if (layer_surface->output) {
- output_update_usable_area(layer_surface->output->data);
- }
struct seat *seat = &layer->server->seat;
if (seat->focused_layer == layer_surface) {
try_to_focus_next_layer_or_toplevel(layer->server);
struct lab_layer_surface *surface = znew(*surface);
struct output *output = layer_surface->output->data;
+ surface->output = output;
wlr_fractional_scale_v1_notify_scale(layer_surface->surface,
output->wlr_output->scale);
wlr_log(WLR_ERROR, "could not create layer surface");
return;
}
+ surface->tree = surface->scene_layer_surface->tree;
/* In support of IME popup */
layer_surface->surface->data = surface->scene_layer_surface->tree;