diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-04-11 16:59:17 +0200 |
---|---|---|
committer | Robert Mader <robert.mader@posteo.de> | 2020-04-16 16:26:04 +0000 |
commit | 8a2b82897db66b3edbe985a370429b4f36b9918c (patch) | |
tree | d47463cea0a8410920b88e86134e1e525172c5b5 | |
parent | e95c365cf01837862f87dea90190b47392ee7f67 (diff) | |
download | mutter-8a2b82897db66b3edbe985a370429b4f36b9918c.tar.gz |
x11: Ensure flush() Flushes all output stream data
This seemed to work under the assumption that a flush() call can
only result in one INCR roundtrip. This is evidently not true, so
we should hold things off until all pending data is actually flushed.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1198
-rw-r--r-- | src/x11/meta-x11-selection-output-stream.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/x11/meta-x11-selection-output-stream.c b/src/x11/meta-x11-selection-output-stream.c index 377bdb801..7ae1e1acc 100644 --- a/src/x11/meta-x11-selection-output-stream.c +++ b/src/x11/meta-x11-selection-output-stream.c @@ -288,12 +288,17 @@ meta_x11_selection_output_stream_invoke_flush (gpointer data) { MetaX11SelectionOutputStream *stream = META_X11_SELECTION_OUTPUT_STREAM (data); + MetaX11SelectionOutputStreamPrivate *priv = + meta_x11_selection_output_stream_get_instance_private (stream); if (meta_x11_selection_output_stream_needs_flush (stream) && meta_x11_selection_output_stream_can_flush (stream)) meta_x11_selection_output_stream_perform_flush (stream); - return G_SOURCE_REMOVE; + if (priv->delete_pending || priv->data->len > 0) + return G_SOURCE_CONTINUE; + else + return G_SOURCE_REMOVE; } static gssize @@ -473,10 +478,9 @@ meta_x11_selection_output_stream_flush_async (GOutputStream *output_stream } } + g_assert (priv->pending_task == NULL); + priv->pending_task = task; meta_x11_selection_output_stream_perform_flush (stream); - g_task_return_boolean (task, TRUE); - g_object_unref (task); - return; } static gboolean |