xwayland: fix outgoing incr transfers
This commit is contained in:
		
							parent
							
								
									8f84c5b05f
								
							
						
					
					
						commit
						d7e03c7adc
					
				|  | @ -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; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue