[PATCH weston 1/2] desktop-shell: fix output removal for background/panel

Pekka Paalanen ppaalanen at gmail.com
Thu Jun 21 12:53:17 UTC 2018


From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

When the compositor has multiple outputs (not clones) and one of them is
removed, the ones remaining to the right will be moved to close the gap.
Because reflowing the remaining outputs happens before removing the
wl_output global, we get the new output x,y before the removal. This
causes us to consider the remaining output immediately to the right of
the removed output to be a clone of the removed output whose x,y don't
get updated. That will then hit the two assertions this patch removes.

The reason the assertions were not actually hit is because of a
compositor bug which moved the remaining outputs in the wrong direction.
The next patch will fix the reflow, so we need this patch first to avoid
the asserts.

Remove the assertions and hand over the background and panel if the
"clone" does not already have them. If the clone already has them, we
destroy the unnecessary background and panel.

Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
---
 clients/desktop-shell.c | 37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
index 6d19d029..fcc0b657 100644
--- a/clients/desktop-shell.c
+++ b/clients/desktop-shell.c
@@ -1337,19 +1337,30 @@ output_remove(struct desktop *desktop, struct output *output)
 	}
 
 	if (rep) {
-		/* If found, hand over the background and panel so they don't
-		 * get destroyed. */
-		assert(!rep->background);
-		assert(!rep->panel);
-
-		rep->background = output->background;
-		output->background = NULL;
-		rep->background->owner = rep;
-
-		rep->panel = output->panel;
-		output->panel = NULL;
-		if (rep->panel)
-			rep->panel->owner = rep;
+		/* If found and it does not already have a background or panel,
+		 * hand over the background and panel so they don't get
+		 * destroyed.
+		 *
+		 * We never create multiple backgrounds or panels for clones,
+		 * but if the compositor moves outputs, a pair of wl_outputs
+		 * might become "clones". This may happen temporarily when
+		 * an output is about to be removed and the rest are reflowed.
+		 * In this case it is correct to let the background/panel be
+		 * destroyed.
+		 */
+
+		if (!rep->background) {
+			rep->background = output->background;
+			output->background = NULL;
+			rep->background->owner = rep;
+		}
+
+		if (!rep->panel) {
+			rep->panel = output->panel;
+			output->panel = NULL;
+			if (rep->panel)
+				rep->panel->owner = rep;
+		}
 	}
 
 	output_destroy(output);
-- 
2.16.4



More information about the wayland-devel mailing list