From b769fcae11ac5af6695b23236bad7324767b5ec1 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 23 Dec 2021 16:30:24 +0100 Subject: scene: schedule an output frame on wl_surface.frame Some clients (e.g. mpv, Firefox) request a new wl_surface.frame callback without damaging their surface. When this happens, schedule a new output frame. Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3350 --- wlr_scene.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'wlr_scene.c') diff --git a/wlr_scene.c b/wlr_scene.c index 7b55096..a0c06b6 100644 --- a/wlr_scene.c +++ b/wlr_scene.c @@ -236,10 +236,6 @@ static void scene_surface_handle_surface_commit(struct wl_listener *listener, wl_container_of(listener, scene_surface, surface_commit); struct wlr_surface *surface = scene_surface->surface; - if (!pixman_region32_not_empty(&surface->buffer_damage)) { - return; - } - struct wlr_scene *scene = scene_node_get_root(&scene_surface->node); int lx, ly; @@ -256,6 +252,17 @@ static void scene_surface_handle_surface_commit(struct wl_listener *listener, return; } + // Even if the surface hasn't submitted damage, schedule a new frame if + // the client has requested a wl_surface.frame callback. + if (!wl_list_empty(&surface->current.frame_callback_list) && + scene_surface->primary_output != NULL) { + wlr_output_schedule_frame(scene_surface->primary_output); + } + + if (!pixman_region32_not_empty(&surface->buffer_damage)) { + return; + } + struct wlr_scene_output *scene_output; wl_list_for_each(scene_output, &scene->outputs, link) { struct wlr_output *output = scene_output->output; -- cgit v1.2.3