commit 2c1078c82c6e67f916cce99629a985f3b91d4022
parent 18acb9d5da07d984be4663c9513fb1af68c419de
Author: Michael Forney <mforney@mforney.org>
Date: Sat, 2 Aug 2014 19:38:05 -0700
compositor: Handle EACCES when view_attach fails
This also changes perform_update to add screens to the pending_flips
mask only after the attach succeeded. This way, when an attach fails, we
still try to update that screen later on.
Diffstat:
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/libswc/compositor.c b/libswc/compositor.c
@@ -149,17 +149,10 @@ static void handle_screen_view_event(struct wl_listener * listener, void * data)
}
}
-static bool target_swap_buffers(struct target * target)
+static int target_swap_buffers(struct target * target)
{
target->next_buffer = wld_surface_take(target->surface);
-
- if (!view_attach(target->view, target->next_buffer))
- {
- ERROR("Failed to attach next frame to screen\n");
- return false;
- }
-
- return true;
+ return view_attach(target->view, target->next_buffer);
}
static struct target * target_new(struct screen * screen)
@@ -709,7 +702,20 @@ static void update_screen(struct screen * screen)
pixman_region32_subtract(&base_damage, total_damage, &compositor.opaque);
renderer_repaint(target, total_damage, &base_damage, &compositor.views);
pixman_region32_fini(&base_damage);
- target_swap_buffers(target);
+
+ switch (target_swap_buffers(target))
+ {
+ case -EACCES:
+ /* If we get an EACCES, it is because this session is being
+ * deactivated, but we haven't yet received the deactivate signal
+ * from swc-launch. */
+ compositor.active = false;
+ compositor.scheduled_updates = 0;
+ break;
+ case 0:
+ compositor.pending_flips |= screen_mask(screen);
+ break;
+ }
}
static void perform_update(void * data)
@@ -731,7 +737,6 @@ static void perform_update(void * data)
/* XXX: Should assert that all damage was covered by some output */
pixman_region32_clear(&compositor.damage);
- compositor.pending_flips |= updates;
compositor.scheduled_updates &= ~updates;
compositor.updating = false;
}