summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiulio Camuffo <giuliocamuffo@gmail.com>2015-07-12 10:52:32 +0300
committerDaniel Stone <daniels@collabora.com>2015-07-13 11:16:55 +0100
commit2f2a70cc8533d6e9f7fca9f6a9d598411c23e700 (patch)
tree01e91349bf669964170f542558887a596c60f8fe
parentf53beb8fb94e5a096bc9e2872b2995a46598dac6 (diff)
downloadweston-2f2a70cc8533d6e9f7fca9f6a9d598411c23e700.tar.gz
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>
-rw-r--r--src/compositor.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/compositor.c b/src/compositor.c
index 150d1fb1..2a117d80 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1079,6 +1079,9 @@ weston_view_assign_output(struct weston_view *ev)
mask = 0;
pixman_region32_init(&region);
wl_list_for_each(output, &ec->output_list, link) {
+ if (output->destroying)
+ continue;
+
pixman_region32_intersect(&region, &ev->transform.boundingbox,
&output->region);
@@ -3888,9 +3891,15 @@ WL_EXPORT void
weston_output_destroy(struct weston_output *output)
{
struct wl_resource *resource;
+ struct weston_view *view;
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);
weston_presentation_feedback_discard_list(&output->feedback_list);