SDL: wayland: destroy frame callback when window is destroyed

From 424bbaec069f0d94857095dcdfacba6246282936 Mon Sep 17 00:00:00 2001
From: Christian Rauch <[EMAIL REDACTED]>
Date: Sat, 1 May 2021 18:53:12 +0100
Subject: [PATCH] wayland: destroy frame callback when window is destroyed

---
 src/video/wayland/SDL_waylandwindow.c | 5 ++++-
 src/video/wayland/SDL_waylandwindow.h | 1 +
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
index 2e4edcda7..fb7f897c3 100644
--- a/src/video/wayland/SDL_waylandwindow.c
+++ b/src/video/wayland/SDL_waylandwindow.c
@@ -208,8 +208,9 @@ handle_surface_frame_done(void *data, struct wl_callback *cb, uint32_t time)
     SDL_AtomicSet(&wind->swap_interval_ready, 1);  /* mark window as ready to present again. */
 
     /* reset this callback to fire again once a new frame was presented and compositor wants the next one. */
+    wind->frame_callback = wl_surface_frame(wind->surface);
     wl_callback_destroy(cb);
-    wl_callback_add_listener(wl_surface_frame(wind->surface), &surface_frame_listener, data);
+    wl_callback_add_listener(wind->frame_callback, &surface_frame_listener, data);
 }
 
 static const struct wl_callback_listener surface_frame_listener = {
@@ -1222,6 +1223,8 @@ void Wayland_DestroyWindow(_THIS, SDL_Window *window)
 
         SDL_free(wind->outputs);
 
+        wl_callback_destroy(wind->frame_callback);
+
 #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
         if (wind->extended_surface) {
             QtExtendedSurface_Unsubscribe(wind->extended_surface, SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION);
diff --git a/src/video/wayland/SDL_waylandwindow.h b/src/video/wayland/SDL_waylandwindow.h
index bcbed5bad..4aa1040d6 100644
--- a/src/video/wayland/SDL_waylandwindow.h
+++ b/src/video/wayland/SDL_waylandwindow.h
@@ -54,6 +54,7 @@ typedef struct {
     SDL_Window *sdlwindow;
     SDL_VideoData *waylandData;
     struct wl_surface *surface;
+    struct wl_callback *frame_callback;
     union {
         SDL_xdg_shell_surface xdg;
         SDL_zxdg_shell_surface zxdg;