diff --git a/include/sway/output.h b/include/sway/output.h index bc03f4c5..b1c74258 100644 --- a/include/sway/output.h +++ b/include/sway/output.h @@ -57,6 +57,7 @@ struct sway_output { uint32_t refresh_nsec; int max_render_time; // In milliseconds struct wl_event_source *repaint_timer; + bool surface_needs_frame; }; struct sway_output *output_create(struct wlr_output *wlr_output); diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 6c78e08d..97ea2e7c 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -515,6 +515,9 @@ int output_repaint_timer_handler(void *data) { output->wlr_output->frame_pending = false; + bool surface_needs_frame = output->surface_needs_frame; + output->surface_needs_frame = false; + struct sway_workspace *workspace = output->current.active_workspace; if (workspace == NULL) { return 0; @@ -557,6 +560,8 @@ int output_repaint_timer_handler(void *data) { clock_gettime(CLOCK_MONOTONIC, &now); output_render(output, &now, &damage); + } else if (surface_needs_frame) { + wlr_output_schedule_frame(output->wlr_output); } pixman_region32_fini(&damage); @@ -672,6 +677,7 @@ static void damage_surface_iterator(struct sway_output *output, struct sway_view wlr_output_damage_add_box(output->damage, &box); } + output->surface_needs_frame = true; wlr_output_schedule_frame(output->wlr_output); }