view: add defensive checks for null content_tree

This commit is contained in:
John Lindgren 2025-11-24 10:35:21 -05:00
parent b1e7282995
commit 8bd20f19dc
4 changed files with 14 additions and 3 deletions

View file

@ -163,7 +163,7 @@ struct view {
struct workspace *workspace; struct workspace *workspace;
struct wlr_surface *surface; struct wlr_surface *surface;
struct wlr_scene_tree *scene_tree; struct wlr_scene_tree *scene_tree;
struct wlr_scene_tree *content_tree; struct wlr_scene_tree *content_tree; /* may be NULL for unmapped view */
/* These are never NULL and an empty string is set instead. */ /* These are never NULL and an empty string is set instead. */
char *title; char *title;

View file

@ -77,7 +77,7 @@ get_view_part(struct view *view, struct wlr_scene_node *node)
snprintf(view_name, sizeof(view_name), "view (%s)", view->app_id); snprintf(view_name, sizeof(view_name), "view (%s)", view->app_id);
return view_name; return view_name;
} }
if (node == &view->content_tree->node) { if (view->content_tree && node == &view->content_tree->node) {
return "view->content_tree"; return "view->content_tree";
} }
if (view->resize_indicator.tree if (view->resize_indicator.tree

View file

@ -74,6 +74,13 @@ render_node(struct server *server, struct wlr_render_pass *pass,
static struct wlr_buffer * static struct wlr_buffer *
render_thumb(struct output *output, struct view *view) render_thumb(struct output *output, struct view *view)
{ {
if (!view->content_tree) {
/*
* Defensive. Could possibly occur if view was unmapped
* with OSD already displayed.
*/
return NULL;
}
struct server *server = output->server; struct server *server = output->server;
struct wlr_buffer *buffer = wlr_allocator_create_buffer(server->allocator, struct wlr_buffer *buffer = wlr_allocator_create_buffer(server->allocator,
view->current.width, view->current.height, view->current.width, view->current.height,

View file

@ -2517,7 +2517,11 @@ view_set_shade(struct view *view, bool shaded)
view->shaded = shaded; view->shaded = shaded;
ssd_enable_shade(view->ssd, view->shaded); ssd_enable_shade(view->ssd, view->shaded);
wlr_scene_node_set_enabled(&view->content_tree->node, !view->shaded); /* An unmapped view may not have a content tree */
if (view->content_tree) {
wlr_scene_node_set_enabled(&view->content_tree->node,
!view->shaded);
}
} }
void void