From cdc21cdcff7e8d9beb1f8d0ea00b71b141c17466 Mon Sep 17 00:00:00 2001 From: emersion Date: Mon, 25 Dec 2017 16:23:17 +0100 Subject: [PATCH] Properly free selection sources --- xwayland/selection.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/xwayland/selection.c b/xwayland/selection.c index 8bcad509..be803599 100644 --- a/xwayland/selection.c +++ b/xwayland/selection.c @@ -507,7 +507,9 @@ static void data_source_send(struct wlr_data_source *base, } static void data_source_cancel(struct wlr_data_source *base) { - // No-op + struct x11_data_source *source = (struct x11_data_source *)base; + wl_array_release(&source->mime_types_atoms); + free(source); } struct x11_primary_selection_source { @@ -528,8 +530,11 @@ static void primary_selection_source_send( } static void primary_selection_source_cancel( - struct wlr_primary_selection_source *source) { - // No-op + struct wlr_primary_selection_source *base) { + struct x11_primary_selection_source *source = + (struct x11_primary_selection_source *)base; + wl_array_release(&source->mime_types_atoms); + free(source); } static bool source_get_targets(struct wlr_xwm_selection *selection, @@ -631,6 +636,8 @@ static void xwm_selection_get_targets(struct wlr_xwm_selection *selection) { if (ok) { wlr_seat_set_selection(xwm->seat, &source->base, wl_display_next_serial(xwm->xwayland->wl_display)); + } else { + source->base.cancel(&source->base); } } else if (selection == &xwm->primary_selection) { struct x11_primary_selection_source *source = @@ -650,6 +657,8 @@ static void xwm_selection_get_targets(struct wlr_xwm_selection *selection) { if (ok) { wlr_seat_set_primary_selection(xwm->seat, &source->base, wl_display_next_serial(xwm->xwayland->wl_display)); + } else { + source->base.cancel(&source->base); } } }