aboutsummaryrefslogtreecommitdiff
path: root/xwayland
diff options
context:
space:
mode:
Diffstat (limited to 'xwayland')
-rw-r--r--xwayland/selection/outgoing.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/xwayland/selection/outgoing.c b/xwayland/selection/outgoing.c
index 33aa225b..943e4d1a 100644
--- a/xwayland/selection/outgoing.c
+++ b/xwayland/selection/outgoing.c
@@ -55,16 +55,27 @@ static int xwm_selection_flush_source_data(
static void xwm_selection_transfer_start_outgoing(
struct wlr_xwm_selection_transfer *transfer);
+static struct wlr_xwm_selection_transfer *xwm_selection_transfer_get_first(
+ struct wlr_xwm_selection *selection) {
+ struct wlr_xwm_selection_transfer *first = NULL;
+ if (!wl_list_empty(&selection->outgoing)) {
+ first = wl_container_of(selection->outgoing.prev, first,
+ outgoing_link);
+ }
+
+ return first;
+}
+
static void xwm_selection_transfer_destroy_outgoing(
struct wlr_xwm_selection_transfer *transfer) {
+ struct wlr_xwm_selection *selection = transfer->selection;
+ bool was_first = transfer == xwm_selection_transfer_get_first(selection);
wl_list_remove(&transfer->outgoing_link);
- // Start next queued transfer
- struct wlr_xwm_selection_transfer *first = NULL;
- if (!wl_list_empty(&transfer->selection->outgoing)) {
- first = wl_container_of(transfer->selection->outgoing.prev, first,
- outgoing_link);
- xwm_selection_transfer_start_outgoing(first);
+ // Start next queued transfer if we just removed the active one.
+ if (was_first && !wl_list_empty(&selection->outgoing)) {
+ xwm_selection_transfer_start_outgoing(
+ xwm_selection_transfer_get_first(selection));
}
xwm_selection_transfer_remove_source(transfer);