diff --git a/include/wlr/types/wlr_presentation_time.h b/include/wlr/types/wlr_presentation_time.h index 48bef659a..3c72fd46f 100644 --- a/include/wlr/types/wlr_presentation_time.h +++ b/include/wlr/types/wlr_presentation_time.h @@ -96,4 +96,12 @@ void wlr_presentation_surface_sampled_on_output( struct wlr_presentation *presentation, struct wlr_surface *surface, struct wlr_output *output); +/** + * Send the presentation event immediately to this surface if the surface is + * asking for presentation events. This must be called during the present handler + * of an output. + */ +void wlr_presentation_send_presented(struct wlr_presentation *presentation, + struct wlr_surface *surface, struct wlr_presentation_event *event); + #endif diff --git a/types/wlr_presentation_time.c b/types/wlr_presentation_time.c index 082b9a93d..f519e5f29 100644 --- a/types/wlr_presentation_time.c +++ b/types/wlr_presentation_time.c @@ -325,3 +325,15 @@ void wlr_presentation_surface_sampled_on_output( feedback->output_destroy.notify = feedback_handle_output_destroy; wl_signal_add(&output->events.destroy, &feedback->output_destroy); } + +void wlr_presentation_send_presented(struct wlr_presentation *presentation, + struct wlr_surface *surface, struct wlr_presentation_event *event) { + struct wlr_presentation_feedback *feedback = + wlr_presentation_surface_sampled(presentation, surface); + if (!feedback) { + return; + } + + wlr_presentation_feedback_send_presented(feedback, event); + wlr_presentation_feedback_destroy(feedback); +}