Hi, On Wed, 2016-08-10 at 12:26 +0200, Christophe Fergeau wrote: > Currently, when the agent asks us for VD_AGENT_CLIPBOARD_UTF8_TEXT data, > spice-gtk looks up for the first X11 target which would provide it with > UTF8_TEXT data, and uses that for the clipboard request. This means we > will use UTF8_STRING as the target for gtk_clipboard_request_contents(). > > However, some applications who can copy and paste text do not > necessarily support the UTF8_STRING target. This is the case for Motif > applications which support the STRING target however. It turns out gtk+ > also provides a gtk_clipboard_request_text() method which will try > several targets (UTF8_TEXT, COMPOUND_TEXT, TEXT), and will ensure the > returned string is UTF-8, so we can use that when the agent asks us for > some text data. > Sounds good to me > This fixes https://bugzilla.redhat.com/show_bug.cgi?id=1348624 > --- > src/spice-gtk-session.c | 65 +++++++++++++++++++++++++++++++++++++++--------- > - > 1 file changed, 52 insertions(+), 13 deletions(-) > > diff --git a/src/spice-gtk-session.c b/src/spice-gtk-session.c > index 1343302..5855610 100644 > --- a/src/spice-gtk-session.c > +++ b/src/spice-gtk-session.c > @@ -947,6 +947,40 @@ static char *fixup_clipboard_text(SpiceGtkSession *self, > const char *text, int * > return conv; > } > > +static void clipboard_received_text_cb(GtkClipboard *clipboard, > + const gchar *text, > + gpointer user_data) > +{ > + WeakRef *weakref = user_data; > + SpiceGtkSession *self = (SpiceGtkSession*)weakref->object; > + char *conv = NULL; > + int len = 0; > + int selection; > + > + weak_unref(weakref); > + > + if (self == NULL) > + return; > + > + g_return_if_fail(SPICE_IS_GTK_SESSION(self)); > + > + selection = get_selection_from_clipboard(self->priv, clipboard); > + g_return_if_fail(selection != -1); > + > + len = strlen(text); > + if (!check_clipboard_size_limits(self, len)) { > + return; > + } > + > + /* gtk+ internal utf8 newline is always LF, even on windows */ > + conv = fixup_clipboard_text(self, text, &len); > + > + spice_main_clipboard_selection_notify(self->priv->main, selection, > + VD_AGENT_CLIPBOARD_UTF8_TEXT, > + (guchar *)conv ?: (guchar*)text, or just (guchar *) (conv ?: text) OT: '?:' is in C or just in gcc ? > len); > + g_free(conv); > +} > + > static void clipboard_received_cb(GtkClipboard *clipboard, > GtkSelectionData *selection_data, > gpointer user_data) > @@ -994,10 +1028,10 @@ static void clipboard_received_cb(GtkClipboard > *clipboard, > const guchar *data = gtk_selection_data_get_data(selection_data); > gpointer conv = NULL; 'conv' is not used ^, should be removed Pavel > > - /* gtk+ internal utf8 newline is always LF, even on windows */ > - if (type == VD_AGENT_CLIPBOARD_UTF8_TEXT) { > - conv = fixup_clipboard_text(self, (gchar *)data, &len); > - } > + /* text should be handled through clipboard_received_text_cb(), not > + * clipboard_received_cb(). > + */ > + g_warn_if_fail(type != VD_AGENT_CLIPBOARD_UTF8_TEXT); > > spice_main_clipboard_selection_notify(s->main, selection, type, > conv ?: data, len); > @@ -1024,16 +1058,21 @@ static gboolean clipboard_request(SpiceMainChannel > *main, guint selection, > cb = get_clipboard_from_selection(s, selection); > g_return_val_if_fail(cb != NULL, FALSE); > > - for (m = 0; m < SPICE_N_ELEMENTS(atom2agent); m++) { > - if (atom2agent[m].vdagent == type) > - break; > - } > - > - g_return_val_if_fail(m < SPICE_N_ELEMENTS(atom2agent), FALSE); > - > - atom = gdk_atom_intern_static_string(atom2agent[m].xatom); > - gtk_clipboard_request_contents(cb, atom, clipboard_received_cb, > + if (type == VD_AGENT_CLIPBOARD_UTF8_TEXT) { > + gtk_clipboard_request_text(cb, clipboard_received_text_cb, > weak_ref(G_OBJECT(self))); > + } else { > + for (m = 0; m < SPICE_N_ELEMENTS(atom2agent); m++) { > + if (atom2agent[m].vdagent == type) > + break; > + } > + > + g_return_val_if_fail(m < SPICE_N_ELEMENTS(atom2agent), FALSE); > + > + atom = gdk_atom_intern_static_string(atom2agent[m].xatom); > + gtk_clipboard_request_contents(cb, atom, clipboard_received_cb, > + weak_ref(G_OBJECT(self))); > + } > > return TRUE; > } _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel