diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 075d09a1..41423b58 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -163,7 +163,7 @@ struct wlr_output { // Emitted right before commit struct wl_signal precommit; // wlr_output_event_precommit // Emitted right after commit - struct wl_signal commit; + struct wl_signal commit; // wlr_output_event_commit // Emitted right after the buffer has been presented to the user struct wl_signal present; // wlr_output_event_present struct wl_signal enable; @@ -198,6 +198,11 @@ struct wlr_output_event_precommit { struct timespec *when; }; +struct wlr_output_event_commit { + struct wlr_output *output; + uint32_t committed; // bitmask of enum wlr_output_state_field +}; + enum wlr_output_present_flag { // The presentation was synchronized to the "vertical retrace" by the // display hardware such that tearing does not happen. diff --git a/types/wlr_output.c b/types/wlr_output.c index 9d02ec3c..1c40a147 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -581,11 +581,11 @@ bool wlr_output_commit(struct wlr_output *output) { struct timespec now; clock_gettime(CLOCK_MONOTONIC, &now); - struct wlr_output_event_precommit event = { + struct wlr_output_event_precommit pre_event = { .output = output, .when = &now, }; - wlr_signal_emit_safe(&output->events.precommit, &event); + wlr_signal_emit_safe(&output->events.precommit, &pre_event); if (!output->impl->commit(output)) { output_state_clear(&output->pending); @@ -604,7 +604,11 @@ bool wlr_output_commit(struct wlr_output *output) { output->commit_seq++; - wlr_signal_emit_safe(&output->events.commit, output); + struct wlr_output_event_commit event = { + .output = output, + .committed = output->pending.committed, + }; + wlr_signal_emit_safe(&output->events.commit, &event); bool scale_updated = output->pending.committed & WLR_OUTPUT_STATE_SCALE; if (scale_updated) {