From 7f4d9ffefa7162c0d78a8071c4a4f5c050ff8885 Mon Sep 17 00:00:00 2001 From: Tomohito Esaki Date: Tue, 5 Jun 2018 10:37:06 +0900 Subject: [PATCH] libweston: Reset repaint schedule for all repainted outputs when repaint cancel All outputs is canceled repaint when a output repaint is failed. At that time, the output whose repaint is success is not scheduled because the repaint status of that is still REPAINT_AWAITING_COMPLETION. Therefore, we need to reset repaint schedule for all repainted outputs. Signed-off-by: Tomohito Esaki Reviewed-by: Pekka Paalanen --- libweston/compositor.c | 8 ++++++++ libweston/compositor.h | 3 +++ 2 files changed, 11 insertions(+) diff --git a/libweston/compositor.c b/libweston/compositor.c index d11a6552..91f311df 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -2450,6 +2450,8 @@ weston_output_maybe_repaint(struct weston_output *output, struct timespec *now, int ret = 0; int64_t msec_to_repaint; + output->repainted = false; + /* We're not ready yet; come back to make a decision later. */ if (output->repaint_status != REPAINT_SCHEDULED) return ret; @@ -2479,6 +2481,7 @@ weston_output_maybe_repaint(struct weston_output *output, struct timespec *now, if (ret != 0) goto err; + output->repainted = true; return ret; err: @@ -2550,6 +2553,11 @@ output_repaint_timer_handler(void *data) compositor->backend->repaint_flush(compositor, repaint_data); } else { + wl_list_for_each(output, &compositor->output_list, link) { + if (output->repainted) + weston_output_schedule_repaint_reset(output); + } + if (compositor->backend->repaint_cancel) compositor->backend->repaint_cancel(compositor, repaint_data); diff --git a/libweston/compositor.h b/libweston/compositor.h index c2c40eeb..8942ab9a 100644 --- a/libweston/compositor.h +++ b/libweston/compositor.h @@ -212,6 +212,9 @@ struct weston_output { * if set, a repaint will eventually occur. */ bool repaint_needed; + /** Used only between repaint_begin and repaint_cancel. */ + bool repainted; + /** State of the repaint loop */ enum { REPAINT_NOT_SCHEDULED = 0, /**< idle; no repaint will occur */