Add comments and whitespace to repaint machinery

repaint_needed / repaint_scheduled are surprisingly subtle. Explode the
conditional with side-effects into more obvious separate calls, and
document what they do.

Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
diff --git a/libweston/compositor.c b/libweston/compositor.c
index 5e23277..4210264 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -2335,15 +2335,30 @@
 {
 	struct weston_output *output = data;
 	struct weston_compositor *compositor = output->compositor;
+	int ret;
 
-	if (output->repaint_needed &&
-	    compositor->state != WESTON_COMPOSITOR_SLEEPING &&
-	    compositor->state != WESTON_COMPOSITOR_OFFSCREEN &&
-	    weston_output_repaint(output) == 0)
-		return 0;
+	/* If we're sleeping, drop the repaint machinery entirely; we will
+	 * explicitly repaint all outputs when we come back. */
+	if (compositor->state == WESTON_COMPOSITOR_SLEEPING ||
+	    compositor->state == WESTON_COMPOSITOR_OFFSCREEN)
+		goto err;
 
+	/* We don't actually need to repaint this output; drop it from
+	 * repaint until something causes damage. */
+	if (!output->repaint_needed)
+		goto err;
+
+	/* If repaint fails, we aren't going to get weston_output_finish_frame
+	 * to trigger a new repaint, so drop it from repaint and hope
+	 * something later schedules a successful repaint. */
+	ret = weston_output_repaint(output);
+	if (ret != 0)
+		goto err;
+
+	return 0;
+
+err:
 	weston_output_schedule_repaint_reset(output);
-
 	return 0;
 }