static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data) { g_return_if_fail(SPICE_IS_GTK_SESSION(user_data)); RunInfo ri = { NULL, }; SpiceGtkSession *self = user_data; SpiceGtkSessionPrivate *s = self->priv; gulong clipboard_handler; gulong agent_handler; int selection; SPICE_DEBUG("clipboard get"); selection = get_selection_from_clipboard(s, clipboard); g_return_if_fail(selection != -1); g_return_if_fail(info < SPICE_N_ELEMENTS(atom2agent)); g_return_if_fail(s->main != NULL); ri.selection_data = selection_data; ri.info = info; ri.loop = g_main_loop_new(NULL, FALSE); ri.selection = selection; clipboard_handler = g_signal_connect(s->main, "main-clipboard-selection", G_CALLBACK(clipboard_got_from_guest), &ri); agent_handler = g_signal_connect(s->main, "notify::agent-connected", G_CALLBACK(clipboard_agent_connected), &ri); spice_main_clipboard_selection_request(s->main, selection, atom2agent[info].vdagent); /* apparently, this is needed to avoid dead-lock, from gtk_dialog_run */ gdk_threads_leave(); g_main_loop_run(ri.loop); gdk_threads_enter(); g_main_loop_unref(ri.loop); ri.loop = NULL; g_signal_handler_disconnect(s->main, clipboard_handler); g_signal_handler_disconnect(s->main, agent_handler); }
static gboolean clipboard_get_data(gpointer data) { SpiceDisplay *display; SpiceDisplayPrivate *d; display = global_display(); if (global_display() == NULL) { return FALSE; } d = SPICE_DISPLAY_GET_PRIVATE(display); if (d->main == NULL) { return FALSE; } spice_main_clipboard_selection_request(d->main, VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD, VD_AGENT_CLIPBOARD_UTF8_TEXT); return FALSE; }