[Spice-devel] [spice-gtk 1/2] clipboard: Add fixup_clipboard_text helper

Pavel Grunt pgrunt at redhat.com
Mon Aug 15 10:37:51 UTC 2016


Hi Christophe,

On Wed, 2016-08-10 at 12:26 +0200, Christophe Fergeau wrote:
> This makes clipboard_received_cb a bit shorter, and will be useful
> in the next commit.
> ---
>  src/spice-gtk-session.c | 63 +++++++++++++++++++++++++++++-------------------
> -
>  1 file changed, 38 insertions(+), 25 deletions(-)
> 
> diff --git a/src/spice-gtk-session.c b/src/spice-gtk-session.c
> index 6cdae87..1343302 100644
> --- a/src/spice-gtk-session.c
> +++ b/src/spice-gtk-session.c
> @@ -910,6 +910,43 @@ static gboolean
> check_clipboard_size_limits(SpiceGtkSession *session,
>      return TRUE;
>  }
>  
> +static char *fixup_clipboard_text(SpiceGtkSession *self, const char *text,
> int *len)

In my opinion would be better if the function worked with
'const GtkSelectionData *' instead of text & len pair. Or keep len as output
only parameter ?

> +{
> +    char *conv = NULL;
> +    int new_len = *len;
> +
> +
> +    if (spice_main_agent_test_capability(self->priv->main,
> VD_AGENT_CAP_GUEST_LINEEND_CRLF)) {
> +        GError *err = NULL;
> +
> +        conv = spice_unix2dos(text, *len, &err);
> +        if (err) {
> +            g_warning("Failed to convert text line ending: %s", err-
> >message);
> +            g_clear_error(&err);
> +            return NULL;
> +        }
> +
> +        new_len = strlen(conv);
> +    } else {
> +        /* On Windows, with some versions of gtk+, GtkSelectionData::length
> +         * will include the final '\0'. When a string with this trailing '\0'
> +         * is pasted in some linux applications, it will be pasted as <NIL>
> or
> +         * as an invisible character, which is unwanted. Ensure the length we
> +         * send to the agent does not include any trailing '\0'
> +         * This is gtk+ bug https://bugzilla.gnome.org/show_bug.cgi?id=734670
> +         */
> +        new_len = strlen(text);
> +    }
> +
> +    if (!check_clipboard_size_limits(self, new_len)) {
> +        g_free(conv);
> +        return NULL;
> +    }
> +
> +    *len = new_len;
> +    return conv;
> +}
> +
>  static void clipboard_received_cb(GtkClipboard *clipboard,
>                                    GtkSelectionData *selection_data,
>                                    gpointer user_data)
> @@ -959,31 +996,7 @@ static void clipboard_received_cb(GtkClipboard
> *clipboard,
>  
>      /* gtk+ internal utf8 newline is always LF, even on windows */
>      if (type == VD_AGENT_CLIPBOARD_UTF8_TEXT) {
> -        if (spice_main_agent_test_capability(s->main,
> VD_AGENT_CAP_GUEST_LINEEND_CRLF)) {
> -            GError *err = NULL;
> -
> -            conv = spice_unix2dos((gchar*)data, len, &err);
> -            if (err) {
> -                g_warning("Failed to convert text line ending: %s", err-
> >message);
> -                g_clear_error(&err);
> -                return;
> -            }
> -
> -            len = strlen(conv);
> -        } else {
> -            /* On Windows, with some versions of gtk+,
> GtkSelectionData::length
> -             * will include the final '\0'. When a string with this trailing
> '\0'
> -             * is pasted in some linux applications, it will be pasted as
> <NIL> or
> -             * as an invisible character, which is unwanted. Ensure the
> length we
> -             * send to the agent does not include any trailing '\0'
> -             * This is gtk+ bug https://bugzilla.gnome.org/show_bug.cgi?id=73
> 4670
> -             */
> -            len = strlen((const char *)data);
> -        }
> -        if (!check_clipboard_size_limits(self, len)) {
> -            g_free(conv);
> -            return;
> -        }
> +        conv = fixup_clipboard_text(self, (gchar *)data, &len);
>      }
>  
>      spice_main_clipboard_selection_notify(s->main, selection, type,


More information about the Spice-devel mailing list