diff --git a/src/backend/wayland/wl_event.c b/src/backend/wayland/wl_event.c index ffa53ac..d7ef0c2 100644 --- a/src/backend/wayland/wl_event.c +++ b/src/backend/wayland/wl_event.c @@ -11,8 +11,16 @@ void wl_event_flush(void) { wl_xdisplay_flush(); /* Commit the scene so intermediate animation frames are visible */ - if (wl_state.scene_output && wl_state.allocator) + if (wl_state.scene_output && wl_state.allocator) { wlr_scene_output_commit(wl_state.scene_output, NULL); + /* Flush the display so the frame reaches the DRM backend, + * then dispatch to process the page-flip completion event + * before returning. Without this, animation loops that + * call event_flush repeatedly only show the final frame. */ + wl_display_flush_clients(wl_state.display); + struct wl_event_loop *loop = wl_display_get_event_loop(wl_state.display); + wl_event_loop_dispatch(loop, 0); + } } void wl_event_flush_expose(void) {} void wl_event_sync(int discard)