From e239295491abef326c2370cb9d680ae326d464de Mon Sep 17 00:00:00 2001
From: Cameron Gutman <[EMAIL REDACTED]>
Date: Wed, 18 Sep 2024 19:37:10 -0500
Subject: [PATCH] wayland: Fix memory leaks
---
src/video/wayland/SDL_waylandevents.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
index ce16822a3286a..65838f4802f89 100644
--- a/src/video/wayland/SDL_waylandevents.c
+++ b/src/video/wayland/SDL_waylandevents.c
@@ -260,12 +260,25 @@ static SDL_bool keyboard_repeat_key_is_set(SDL_WaylandKeyboardRepeat *repeat_inf
return repeat_info->is_initialized && repeat_info->is_key_down && key == repeat_info->key;
}
+static void sync_done_handler(void *data, struct wl_callback *callback, uint32_t callback_data)
+{
+ /* Nothing to do, just destroy the callback */
+ wl_callback_destroy(callback);
+}
+
+static struct wl_callback_listener sync_listener = {
+ sync_done_handler
+};
+
void Wayland_SendWakeupEvent(_THIS, SDL_Window *window)
{
SDL_VideoData *d = _this->driverdata;
- /* TODO: Maybe use a pipe to avoid the compositor roundtrip? */
- wl_display_sync(d->display);
+ /* Queue a sync event to unblock the event queue fd if it's empty and being waited on.
+ * TODO: Maybe use a pipe to avoid the compositor roundtrip?
+ */
+ struct wl_callback *cb = wl_display_sync(d->display);
+ wl_callback_add_listener(cb, &sync_listener, NULL);
WAYLAND_wl_display_flush(d->display);
}
@@ -2537,6 +2550,9 @@ void Wayland_display_destroy_input(SDL_VideoData *d)
if (input->primary_selection_device->selection_offer) {
Wayland_primary_selection_offer_destroy(input->primary_selection_device->selection_offer);
}
+ if (input->primary_selection_device->primary_selection_device) {
+ zwp_primary_selection_device_v1_destroy(input->primary_selection_device->primary_selection_device);
+ }
SDL_free(input->primary_selection_device);
}