xwayland: fix outgoing incr transfers

This commit is contained in:
emersion 2018-04-03 10:25:50 -04:00
parent 8f84c5b05f
commit d7e03c7adc
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48

View file

@ -188,7 +188,8 @@ static int xwm_data_source_read(int fd, uint32_t mask, void *data) {
"property", transfer->source_data.size); "property", transfer->source_data.size);
xwm_selection_flush_source_data(transfer); xwm_selection_flush_source_data(transfer);
} }
xwm_selection_transfer_destroy_outgoing(transfer); xwm_selection_transfer_remove_source(transfer);
xwm_selection_transfer_close_source_fd(transfer);
} else { } else {
wlr_log(L_DEBUG, "nothing happened, buffered the bytes"); wlr_log(L_DEBUG, "nothing happened, buffered the bytes");
} }
@ -201,6 +202,32 @@ error_out:
return 0; return 0;
} }
static void xwm_send_incr_chunk(struct wlr_xwm_selection_transfer *transfer) {
wlr_log(L_DEBUG, "property deleted");
transfer->property_set = false;
if (transfer->flush_property_on_delete) {
wlr_log(L_DEBUG, "setting new property, %zu bytes",
transfer->source_data.size);
transfer->flush_property_on_delete = false;
int length = xwm_selection_flush_source_data(transfer);
if (transfer->source_fd >= 0) {
xwm_selection_transfer_start_outgoing(transfer);
} else if (length > 0) {
/* Transfer is all done, but queue a flush for
* the delete of the last chunk so we can set
* the 0 sized property to signal the end of
* the transfer. */
transfer->flush_property_on_delete = true;
wl_array_release(&transfer->source_data);
wl_array_init(&transfer->source_data);
} else {
xwm_selection_transfer_destroy_outgoing(transfer);
}
}
}
static void xwm_selection_source_send(struct wlr_xwm_selection *selection, static void xwm_selection_source_send(struct wlr_xwm_selection *selection,
const char *mime_type, int32_t fd) { const char *mime_type, int32_t fd) {
if (selection == &selection->xwm->clipboard_selection) { if (selection == &selection->xwm->clipboard_selection) {
@ -629,8 +656,7 @@ static int xwm_handle_selection_property_notify(struct wlr_xwm *xwm,
if (event->state == XCB_PROPERTY_DELETE && if (event->state == XCB_PROPERTY_DELETE &&
event->atom == outgoing->request.property && event->atom == outgoing->request.property &&
outgoing->incr) { outgoing->incr) {
wlr_log(L_DEBUG, "send incr chunk"); xwm_send_incr_chunk(outgoing);
// TODO
} }
return 1; return 1;
} }