compositor: make sure to reset views' pointers to destroyed output

When an output is being destroyed reassign the output of the views
that were in it, to be sure not to keep a dangling pointer which could
be used later on by calling weston_surface_assign_output() on the
view's surface.
Also make sure we send wl_surface.leave events to the surfaces that
were in that output.

Reviewed-by: Jonas Ådahl <jadahl@gmail.com>
dev
Giulio Camuffo 9 years ago committed by Daniel Stone
parent f53beb8fb9
commit 2f2a70cc85
  1. 9
      src/compositor.c

@ -1079,6 +1079,9 @@ weston_view_assign_output(struct weston_view *ev)
mask = 0; mask = 0;
pixman_region32_init(&region); pixman_region32_init(&region);
wl_list_for_each(output, &ec->output_list, link) { wl_list_for_each(output, &ec->output_list, link) {
if (output->destroying)
continue;
pixman_region32_intersect(&region, &ev->transform.boundingbox, pixman_region32_intersect(&region, &ev->transform.boundingbox,
&output->region); &output->region);
@ -3888,9 +3891,15 @@ WL_EXPORT void
weston_output_destroy(struct weston_output *output) weston_output_destroy(struct weston_output *output)
{ {
struct wl_resource *resource; struct wl_resource *resource;
struct weston_view *view;
output->destroying = 1; output->destroying = 1;
wl_list_for_each(view, &output->compositor->view_list, link) {
if (view->output_mask & (1 << output->id))
weston_view_assign_output(view);
}
wl_event_source_remove(output->repaint_timer); wl_event_source_remove(output->repaint_timer);
weston_presentation_feedback_discard_list(&output->feedback_list); weston_presentation_feedback_discard_list(&output->feedback_list);

Loading…
Cancel
Save