aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/output.h1
-rw-r--r--sway/desktop/output.c6
2 files changed, 7 insertions, 0 deletions
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);
}