aboutsummaryrefslogtreecommitdiff
path: root/xwayland
diff options
context:
space:
mode:
authorJohn Chadwick <john@jchw.io>2020-07-02 19:25:25 -0700
committerSimon Ser <contact@emersion.fr>2020-07-03 09:42:36 +0200
commit58bcec9d9490b1421611854aaf5ca3ece4581f27 (patch)
tree0110b92162035778a2c1053e62c89e2f1c138f36 /xwayland
parentf82a27f55a3be7f2d6bdd53a306f49f339ef6b8f (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')
-rw-r--r--xwayland/selection/outgoing.c21
-rw-r--r--xwayland/xwm.c1
2 files changed, 22 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);
+ }
+ }
+ }
+}
diff --git a/xwayland/xwm.c b/xwayland/xwm.c
index a0ff4d90..28e329f3 100644
--- a/xwayland/xwm.c
+++ b/xwayland/xwm.c
@@ -846,6 +846,7 @@ static void xwm_handle_destroy_notify(struct wlr_xwm *xwm,
return;
}
xwayland_surface_destroy(xsurface);
+ xwm_handle_selection_destroy_notify(xwm, ev);
}
static void xwm_handle_configure_request(struct wlr_xwm *xwm,