diff options
| author | Simon Ser <contact@emersion.fr> | 2022-05-27 11:35:33 +0200 | 
|---|---|---|
| committer | Simon Ser <contact@emersion.fr> | 2022-05-30 11:40:34 +0200 | 
| commit | 501ac5398d6f9a85dfdeeb9bf60a342bcff35adc (patch) | |
| tree | 76ce02ac07cf349d47632e468277b478a04c477b | |
| parent | b21c26a1c9b5f035eb69ede201980c82c256dabc (diff) | |
| download | wlroots-501ac5398d6f9a85dfdeeb9bf60a342bcff35adc.tar.xz | |
output: add output_state_{init,finish}
| -rw-r--r-- | types/output/output.c | 19 | 
1 files changed, 17 insertions, 2 deletions
| diff --git a/types/output/output.c b/types/output/output.c index a587edc1..cdfb48ff 100644 --- a/types/output/output.c +++ b/types/output/output.c @@ -382,6 +382,21 @@ static void handle_display_destroy(struct wl_listener *listener, void *data) {  	wlr_output_destroy_global(output);  } +static void output_state_init(struct wlr_output_state *state) { +	memset(state, 0, sizeof(*state)); +	pixman_region32_init(&state->damage); +} + +static void output_state_finish(struct wlr_output_state *state) { +	wlr_buffer_unlock(state->buffer); +	// struct wlr_buffer is ref'counted, so the pointer may remain valid after +	// wlr_buffer_unlock(). Reset the field to NULL to ensure nobody mistakenly +	// reads it after output_state_finish(). +	state->buffer = NULL; +	pixman_region32_fini(&state->damage); +	free(state->gamma_lut); +} +  void wlr_output_init(struct wlr_output *output, struct wlr_backend *backend,  		const struct wlr_output_impl *impl, struct wl_display *display) {  	assert(impl->commit); @@ -411,7 +426,7 @@ void wlr_output_init(struct wlr_output *output, struct wlr_backend *backend,  	wl_signal_init(&output->events.mode);  	wl_signal_init(&output->events.description);  	wl_signal_init(&output->events.destroy); -	pixman_region32_init(&output->pending.damage); +	output_state_init(&output->pending);  	const char *no_hardware_cursors = getenv("WLR_NO_HARDWARE_CURSORS");  	if (no_hardware_cursors != NULL && strcmp(no_hardware_cursors, "1") == 0) { @@ -461,7 +476,7 @@ void wlr_output_destroy(struct wlr_output *output) {  	free(output->name);  	free(output->description); -	pixman_region32_fini(&output->pending.damage); +	output_state_finish(&output->pending);  	if (output->impl && output->impl->destroy) {  		output->impl->destroy(output); | 
