From 928cb37f9a242a43cfe97d2ce63a1521d6bfd5a2 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sat, 28 Jan 2023 23:26:58 +0100 Subject: [PATCH] Fix wl_callback memory leak And better behave when multiple configure events are received. --- include/chayang.h | 1 + main.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/chayang.h b/include/chayang.h index 923db41..34efca9 100644 --- a/include/chayang.h +++ b/include/chayang.h @@ -28,6 +28,7 @@ struct chayang_output { struct wl_surface *surface; struct zwlr_layer_surface_v1 *layer_surface; struct wp_viewport *viewport; + struct wl_callback *frame_callback; int32_t surface_width, surface_height; }; diff --git a/main.c b/main.c index 00e883e..ddc4336 100644 --- a/main.c +++ b/main.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -31,7 +32,12 @@ static void cancel(struct chayang *state) { static void frame_callback_handle_done(void *data, struct wl_callback *callback, uint32_t time) { struct chayang_output *output = data; + if (callback == NULL) { + return; + } + assert(callback == output->frame_callback); wl_callback_destroy(callback); + output->frame_callback = NULL; repaint_output(output); } @@ -53,8 +59,11 @@ static void repaint_output(struct chayang_output *output) { wp_viewport_set_destination(output->viewport, output->surface_width, output->surface_height); - struct wl_callback *frame_callback = wl_surface_frame(output->surface); - wl_callback_add_listener(frame_callback, &frame_callback_listener, output); + if (output->frame_callback != NULL) { + wl_callback_destroy(output->frame_callback); + } + output->frame_callback = wl_surface_frame(output->surface); + wl_callback_add_listener(output->frame_callback, &frame_callback_listener, output); wl_surface_damage(output->surface, 0, 0, INT32_MAX, INT32_MAX); wl_surface_commit(output->surface); @@ -63,6 +72,9 @@ static void repaint_output(struct chayang_output *output) { } static void destroy_output(struct chayang_output *output) { + if (output->frame_callback != NULL) { + wl_callback_destroy(output->frame_callback); + } wp_viewport_destroy(output->viewport); zwlr_layer_surface_v1_destroy(output->layer_surface); wl_surface_destroy(output->surface); -- 2.38.5