diff options
Diffstat (limited to 'xwayland/selection/outgoing.c')
| -rw-r--r-- | xwayland/selection/outgoing.c | 26 | 
1 files changed, 25 insertions, 1 deletions
| diff --git a/xwayland/selection/outgoing.c b/xwayland/selection/outgoing.c index 943e4d1a..190fb741 100644 --- a/xwayland/selection/outgoing.c +++ b/xwayland/selection/outgoing.c @@ -71,9 +71,11 @@ static void xwm_selection_transfer_destroy_outgoing(  	struct wlr_xwm_selection *selection = transfer->selection;  	bool was_first = transfer == xwm_selection_transfer_get_first(selection);  	wl_list_remove(&transfer->outgoing_link); +	wlr_log(WLR_DEBUG, "Destroying transfer %p", transfer);  	// Start next queued transfer if we just removed the active one.  	if (was_first && !wl_list_empty(&selection->outgoing)) { +		wlr_log(WLR_DEBUG, "Destroyed transfer was active, starting next");  		xwm_selection_transfer_start_outgoing(  			xwm_selection_transfer_get_first(selection));  	} @@ -230,6 +232,8 @@ static void xwm_selection_transfer_start_outgoing(  	struct wlr_xwm *xwm = transfer->selection->xwm;  	struct wl_event_loop *loop =  		wl_display_get_event_loop(xwm->xwayland->wl_display); +	wlr_log(WLR_DEBUG, "Starting transfer %p", transfer); +	assert(transfer == xwm_selection_transfer_get_first(transfer->selection));  	transfer->source = wl_event_loop_add_fd(loop, transfer->source_fd,  		WL_EVENT_READABLE, xwm_data_source_read, transfer);  } @@ -312,14 +316,34 @@ static void xwm_selection_send_data(struct wlr_xwm_selection *selection,  	transfer->source_fd = p[0];  	wlr_log(WLR_DEBUG, "Sending Wayland selection %u to Xwayland window with " -		"MIME type %s, target %u", req->target, mime_type, req->target); +		"MIME type %s, target %u, transfer %p", req->target, mime_type, +		req->target, transfer);  	xwm_selection_source_send(selection, mime_type, p[1]); +	// It seems that if we ever try to reply to a selection request after +	// another has been sent by the same requestor, the requestor never reads +	// from it. It appears to only ever read from the latest, so purge stale +	// transfers to prevent clipboard hangs. +	struct wlr_xwm_selection_transfer *outgoing, *tmp; +	wl_list_for_each_safe(outgoing, tmp, &selection->outgoing, outgoing_link) { +		if (transfer->request.requestor == outgoing->request.requestor) { +			wlr_log(WLR_DEBUG, "Destroying stale transfer %p", outgoing); +			xwm_selection_send_notify(selection->xwm, &outgoing->request, false); +			xwm_selection_transfer_destroy_outgoing(outgoing); +		} +	} +  	wl_list_insert(&selection->outgoing, &transfer->outgoing_link);  	// We can only handle one transfer at a time  	if (wl_list_length(&selection->outgoing) == 1) { +		wlr_log(WLR_DEBUG, "No transfer active, starting %p now", transfer);  		xwm_selection_transfer_start_outgoing(transfer); +	} else { +		struct wlr_xwm_selection_transfer *outgoing; +		wl_list_for_each(outgoing, &selection->outgoing, outgoing_link) { +			wlr_log(WLR_DEBUG, "Transfer %p still queued", outgoing); +		}  	}  } | 
