summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-04-11 16:59:17 +0200
committerRobert Mader <robert.mader@posteo.de>2020-04-16 16:26:04 +0000
commit8a2b82897db66b3edbe985a370429b4f36b9918c (patch)
treed47463cea0a8410920b88e86134e1e525172c5b5
parente95c365cf01837862f87dea90190b47392ee7f67 (diff)
downloadmutter-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.c12
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