aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kenny Levinsen <kl@kl.wtf>2019-11-28 23:00:03 +0100
committerLibravatar Simon Ser <contact@emersion.fr>2019-11-28 23:40:36 +0100
commit4b579536288108ec09bb8523dea6799228d3d7fa (patch)
tree2a24093fdc7ff3124123c4d77f200d6429518873
parentRename 'node' to 'nodes' in swayipc doc (diff)
downloadsway-4b579536288108ec09bb8523dea6799228d3d7fa.tar.gz
sway-4b579536288108ec09bb8523dea6799228d3d7fa.tar.zst
sway-4b579536288108ec09bb8523dea6799228d3d7fa.zip
output: Ensure that frame_done is delayed on max_render_time
max_render_time can be set on output, view, or both. However, if only applied to the output, send_frame_done_iterator would erroneously send frame_done immediately, ignoring the output max_render_time. As damage_handle_frame processed max_render_time correctly, idle frames would be blocked in anticipation of the delay that was meant to happen. Without the delay, frame events would be dispatched during the idle frame block, and some clients would never receive the frame done events they had requested, at least not until something else actively drove another render. Respecting both view and output max_render_time in send_frame_done_iterator ensures that the frame events are always correctly delayed. Fixes #4756
-rw-r--r--sway/desktop/output.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 58368f20..266ca7fe 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -426,7 +426,7 @@ static void send_frame_done_iterator(struct sway_output *output, struct sway_vie
426 int delay = data->msec_until_refresh - output->max_render_time 426 int delay = data->msec_until_refresh - output->max_render_time
427 - view_max_render_time; 427 - view_max_render_time;
428 428
429 if (output->max_render_time == 0 || view_max_render_time == 0 || delay < 1) { 429 if ((output->max_render_time == 0 && view_max_render_time == 0) || delay < 1) {
430 wlr_surface_send_frame_done(surface, &data->when); 430 wlr_surface_send_frame_done(surface, &data->when);
431 } else { 431 } else {
432 struct sway_surface *sway_surface = surface->data; 432 struct sway_surface *sway_surface = surface->data;