summaryrefslogtreecommitdiffstats
path: root/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-Add-paint-node-destruction-into-weston_lay.patch
blob: 19eadcf7f8aa6acb8bcba9111e58d981903fcae2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
From cfde02d47a503cbfd0629bbfe0cb776686af8a91 Mon Sep 17 00:00:00 2001
From: Marius Vlad <marius.vlad@collabora.com>
Date: Tue, 9 Apr 2024 18:34:22 +0300
Subject: [PATCH] libweston: Add paint node destruction into
 weston_layer_entry_remove()

This prevents a potential crash where users of
weston_layer_entry_insert/layer_entry_remove() would see when moving
views into a NULL layer (effectively unmapping the surface/view).

Users that have migrated to the weston_view_move_to_layer() are immune
to this issue because that takes care paint node destruction.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
---
 libweston/compositor.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/libweston/compositor.c b/libweston/compositor.c
index bb29b83b5..ea257bb90 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -3980,17 +3980,10 @@ weston_view_move_to_layer(struct weston_view *view,
 			  struct weston_layer_entry *layer)
 {
 	bool was_mapped = view->is_mapped;
-	struct weston_paint_node *pnode, *pntmp;
 
 	if (layer == &view->layer_link)
 		return;
 
-	/* Remove all paint nodes because we have no idea what a layer change
-	 * does to view visibility on any output.
-	 */
-	wl_list_for_each_safe(pnode, pntmp, &view->paint_node_list, view_link)
-		weston_paint_node_destroy(pnode);
-
 	view->surface->compositor->view_list_needs_rebuild = true;
 
 	/* Damage the view's old region, and remove it from the layer. */
@@ -4020,6 +4013,16 @@ weston_view_move_to_layer(struct weston_view *view,
 WL_EXPORT void
 weston_layer_entry_remove(struct weston_layer_entry *entry)
 {
+	struct weston_paint_node *pnode, *pntmp;
+	struct weston_view *view;
+
+	/* Remove all paint nodes because we have no idea what a layer change
+	 * does to view visibility on any output.
+	 */
+	view = container_of(entry, struct weston_view, layer_link);
+	wl_list_for_each_safe(pnode, pntmp, &view->paint_node_list, view_link)
+		weston_paint_node_destroy(pnode);
+
 	wl_list_remove(&entry->link);
 	wl_list_init(&entry->link);
 	entry->layer = NULL;
-- 
2.43.0