diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 13591bf..4f0ed6b 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -1972,8 +1972,12 @@ handle_output_frame(struct wl_listener *listener, void *data) ++frame_count; if (wl_state.allocator) { /* Full scene commit — renders client surfaces and fires - * wl_surface.frame callbacks so clients can submit next buffer. */ + * wl_surface.frame callbacks so clients can submit next buffer. + * Also send frame_done unconditionally so clients aren't stalled. */ wlr_scene_output_commit(wl_state.scene_output, NULL); + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + wlr_scene_output_send_frame_done(wl_state.scene_output, &now); } else { /* No GPU allocator available (e.g. headless without DRI access). * Skip rendering but still fire wl_surface.frame callbacks so @@ -3236,6 +3240,8 @@ wl_event_loop_run(void) struct wl_event_loop *loop = wl_display_get_event_loop(wl_state.display); while (!wl_state.terminate) { wl_display_flush_clients(wl_state.display); + if (wl_state.output) + wlr_output_schedule_frame(wl_state.output); wl_event_loop_dispatch(loop, 16); /* Drain WINGs event queue */