When user drags a file to SpiceDisplay and drops it, a signal named "drag-data-received" will be emitted, the signal will be received by SpiceDisplay, then our signal handler should receive data which contains file path, and call spice_main_file_xfer() to transfer file to guest. Signed-off-by: Dunrong Huang <riegamaths@xxxxxxxxx> --- gtk/spice-widget.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c index cdcff03..8e5e412 100644 --- a/gtk/spice-widget.c +++ b/gtk/spice-widget.c @@ -464,14 +464,56 @@ static gboolean grab_broken(SpiceDisplay *self, GdkEventGrabBroken *event, return false; } +/* TODO: support transfering directories. */ +static void drag_data_received_callback(SpiceDisplay *self, + GdkDragContext *drag_context, + gint x, + gint y, + GtkSelectionData *data, + guint info, + guint time, + gpointer *user_data) +{ + int len; + char *buf; + GList *file_list = NULL; + gchar **file_urls, **p; + SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(self); + + /* We get a buf like: + * file:///root/a.txt\r\nfile:///root/b.txt\r\n + */ + SPICE_DEBUG("%s: drag a file", __FUNCTION__); + buf = (char *)gtk_selection_data_get_data_with_length(data, &len); + if (buf == NULL && len <= 0) { + return ; + } + + p = file_urls = g_uri_list_extract_uris(buf); + while (p && *p) { + gchar *url = g_strdup(*p); + file_list = g_list_append(file_list, url); + p++; + } + g_strfreev(file_urls); + + spice_main_file_xfer(d->main, file_list, NULL); + + gtk_drag_finish(drag_context, TRUE, FALSE, time); +} + static void spice_display_init(SpiceDisplay *display) { GtkWidget *widget = GTK_WIDGET(display); SpiceDisplayPrivate *d; + GtkTargetEntry targets = {"text/plain", 0, 0}; d = display->priv = SPICE_DISPLAY_GET_PRIVATE(display); g_signal_connect(display, "grab-broken-event", G_CALLBACK(grab_broken), NULL); + gtk_drag_dest_set(widget, GTK_DEST_DEFAULT_ALL, &targets, 1, GDK_ACTION_COPY); + g_signal_connect(display, "drag-data-received", + G_CALLBACK(drag_data_received_callback), NULL); gtk_widget_add_events(widget, GDK_STRUCTURE_MASK | GDK_POINTER_MOTION_MASK | -- 1.8.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel