remote-desktop/session: Add support for SelectionTransfer/Write

When a transfer request is done to the MetaSelectionSourceRemote source,
it's translated to a SelectionTransfer signal, which the remote desktop
server is supposed to respond to with SelectionWrite.

A timeout (set to 15 seconds) is added to handle too long timeouts,
which cancels the transfer request.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1552>
This commit is contained in:
Jonas Ådahl
2020-11-04 16:09:42 +01:00
committed by Marge Bot
parent d7c8535ac6
commit 5104a9b2ce
5 changed files with 340 additions and 23 deletions

View File

@@ -22,6 +22,8 @@
#include "core/meta-selection-source-remote.h"
#include <gio/gunixinputstream.h>
#include "backends/meta-remote-desktop-session.h"
struct _MetaSelectionSourceRemote
@@ -56,16 +58,16 @@ meta_selection_source_remote_read_async (MetaSelectionSource *source,
GAsyncReadyCallback callback,
gpointer user_data)
{
MetaSelectionSourceRemote *source_remote =
META_SELECTION_SOURCE_REMOTE (source);
GTask *task;
GInputStream *stream;
task = g_task_new (source, cancellable, callback, user_data);
g_task_set_source_tag (task, meta_selection_source_remote_read_async);
stream = g_memory_input_stream_new_from_data ("place holder text", -1, NULL);
g_task_return_pointer (task, stream, g_object_unref);
g_object_unref (task);
meta_remote_desktop_session_request_transfer (source_remote->session,
mimetype,
task);
}
static GInputStream *
@@ -80,6 +82,27 @@ meta_selection_source_remote_read_finish (MetaSelectionSource *source,
return g_task_propagate_pointer (G_TASK (result), error);
}
void
meta_selection_source_remote_complete_transfer (MetaSelectionSourceRemote *source_remote,
int fd,
GTask *task)
{
GInputStream *stream;
stream = g_unix_input_stream_new (fd, TRUE);
g_task_return_pointer (task, stream, g_object_unref);
g_object_unref (task);
}
void
meta_selection_source_remote_cancel_transfer (MetaSelectionSourceRemote *source_remote,
GTask *task)
{
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED,
"Remote selection transfer was cancelled");
g_object_unref (task);
}
static GList *
meta_selection_source_remote_get_mimetypes (MetaSelectionSource *source)
{