diff --git a/src/x11/meta-x11-selection-output-stream.c b/src/x11/meta-x11-selection-output-stream.c index 9c16ac746..fa6b27523 100644 --- a/src/x11/meta-x11-selection-output-stream.c +++ b/src/x11/meta-x11-selection-output-stream.c @@ -207,7 +207,7 @@ meta_x11_selection_output_stream_perform_flush (MetaX11SelectionOutputStream *st MetaX11SelectionOutputStreamPrivate *priv = meta_x11_selection_output_stream_get_instance_private (stream); Display *xdisplay; - size_t element_size, n_elements; + size_t element_size, n_elements, max_size; gboolean first_chunk = FALSE; int error_code; @@ -222,6 +222,7 @@ meta_x11_selection_output_stream_perform_flush (MetaX11SelectionOutputStream *st element_size = get_element_size (priv->format); n_elements = priv->data->len / element_size; + max_size = get_max_request_size (priv->x11_display); if (!priv->incr) first_chunk = TRUE; @@ -251,9 +252,13 @@ meta_x11_selection_output_stream_perform_flush (MetaX11SelectionOutputStream *st } else { + size_t copy_n_elements; + if (priv->incr && priv->data->len > 0) priv->delete_pending = TRUE; + copy_n_elements = MIN (n_elements, max_size / element_size); + XChangeProperty (xdisplay, priv->xwindow, priv->xproperty, @@ -261,8 +266,8 @@ meta_x11_selection_output_stream_perform_flush (MetaX11SelectionOutputStream *st priv->format, PropModeReplace, priv->data->data, - n_elements); - g_byte_array_remove_range (priv->data, 0, n_elements * element_size); + copy_n_elements); + g_byte_array_remove_range (priv->data, 0, copy_n_elements * element_size); } if (first_chunk)