When all outputs are gone and views were created before they
were gone, all views would have an output that points to a
destroyed object.

Instead, mark the view as dirty and set the view output to
NULL so a view gets an output assigned as soon as it gets
plugged in.

Signed-off-by: Armin Krezović <krezovic.ar...@gmail.com>
---
 libweston/compositor.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/libweston/compositor.c b/libweston/compositor.c
index 96eeb17..4467555 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -1212,10 +1212,14 @@ get_view_layer(struct weston_view *view)
 WL_EXPORT void
 weston_view_update_transform(struct weston_view *view)
 {
+       struct weston_compositor *ec = view->surface->compositor;;
        struct weston_view *parent = view->geometry.parent;
        struct weston_layer *layer;
        pixman_region32_t mask;
 
+       if (wl_list_empty(&ec->output_list))
+               return;
+
        if (!view->transform.dirty)
                return;
 
@@ -4085,11 +4089,6 @@ weston_output_destroy(struct weston_output *output)
 
        output->destroying = 1;
 
-       wl_list_for_each(view, &output->compositor->view_list, link) {
-               if (view->output_mask & (1u << output->id))
-                       weston_view_assign_output(view);
-       }
-
        wl_event_source_remove(output->repaint_timer);
 
        weston_presentation_feedback_discard_list(&output->feedback_list);
@@ -4097,6 +4096,16 @@ weston_output_destroy(struct weston_output *output)
        weston_compositor_reflow_outputs(output->compositor, output, 
output->width);
        wl_list_remove(&output->link);
 
+       wl_list_for_each(view, &output->compositor->view_list, link) {
+               if (wl_list_empty(&output->compositor->output_list)) {
+                       weston_view_geometry_dirty(view);
+                       view->output = NULL;
+               }
+               else if (view->output_mask & (1u << output->id)) {
+                       weston_view_assign_output(view);
+               }
+       }
+
        wl_signal_emit(&output->compositor->output_destroyed_signal, output);
        wl_signal_emit(&output->destroy_signal, output);
 
-- 
2.9.2

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to