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:
@@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user