From 31c129b21839c961bbe13588300a89061bff1087 Mon Sep 17 00:00:00 2001 From: "Devin J. Pohly" Date: Mon, 16 Oct 2023 16:55:17 -0500 Subject: [PATCH] Update scene node when an unmanaged window moves A null check had to be added because, since a view's scene isn't created until .map, there's a possibility that .set_geometry is called before the scene node exists. --- view.c | 7 ++++++- xwayland.c | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/view.c b/view.c index 4c913a4..ffd502a 100644 --- a/view.c +++ b/view.c @@ -94,7 +94,11 @@ view_position(struct cg_view *view) /* We shouldn't position override-redirect windows. They set their own (x,y) coordinates in handle_xwayland_surface_set_geometry. */ if (view->type == CAGE_XWAYLAND_VIEW && !xwayland_view_should_manage(view)) { - wlr_scene_node_set_position(&view->scene_tree->node, view->lx, view->ly); + /* The scene is created in .map, but .set_geometry can come + * before that. */ + if (view->scene_tree != NULL) { + wlr_scene_node_set_position(&view->scene_tree->node, view->lx, view->ly); + } } else #endif if (view_is_primary(view) || view_extends_output_layout(view, &layout_box)) { @@ -119,6 +123,7 @@ view_unmap(struct cg_view *view) wl_list_remove(&view->link); wlr_scene_node_destroy(&view->scene_tree->node); + view->scene_tree = NULL; view->wlr_surface->data = NULL; view->wlr_surface = NULL; diff --git a/xwayland.c b/xwayland.c index f8e0bd5..3697566 100644 --- a/xwayland.c +++ b/xwayland.c @@ -112,6 +112,7 @@ handle_xwayland_surface_set_geometry(struct wl_listener *listener, void *data) if (!xwayland_view_should_manage(view)) { view->lx = xwayland_view->xwayland_surface->x; view->ly = xwayland_view->xwayland_surface->y; + view_position(view); } }