diff options
author | John Chadwick <john@jchw.io> | 2020-07-02 19:25:25 -0700 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2020-07-03 09:42:36 +0200 |
commit | 58bcec9d9490b1421611854aaf5ca3ece4581f27 (patch) | |
tree | 0110b92162035778a2c1053e62c89e2f1c138f36 /xwayland/selection | |
parent | f82a27f55a3be7f2d6bdd53a306f49f339ef6b8f (diff) |
xwm: end transfers when the requestor is destroyed
This improves the failure cases when incremental transfers fail to
complete successfully for one reason or another.
Diffstat (limited to 'xwayland/selection')
-rw-r--r-- | xwayland/selection/outgoing.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/xwayland/selection/outgoing.c b/xwayland/selection/outgoing.c index fd5021d5..169f516e 100644 --- a/xwayland/selection/outgoing.c +++ b/xwayland/selection/outgoing.c @@ -3,6 +3,7 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <wayland-util.h> #include <wlr/types/wlr_data_device.h> #include <wlr/types/wlr_primary_selection.h> #include <wlr/util/log.h> @@ -417,3 +418,23 @@ void xwm_handle_selection_request(struct wlr_xwm *xwm, free(mime_type); } } + +void xwm_handle_selection_destroy_notify(struct wlr_xwm *xwm, + xcb_destroy_notify_event_t *event) { + struct wlr_xwm_selection *selections[] = { + &xwm->clipboard_selection, + &xwm->primary_selection, + &xwm->dnd_selection, + }; + + for (size_t i = 0; i < sizeof(selections)/sizeof(selections[0]); ++i) { + struct wlr_xwm_selection *selection = selections[i]; + + struct wlr_xwm_selection_transfer *outgoing, *tmp; + wl_list_for_each_safe(outgoing, tmp, &selection->outgoing, outgoing_link) { + if (event->window == outgoing->request.requestor) { + xwm_selection_transfer_destroy_outgoing(outgoing); + } + } + } +} |