[Spice-commits] src/spice-gtk-session.c

Victor Toso de Carvalho victortoso at kemper.freedesktop.org
Mon Feb 27 09:51:19 UTC 2017


 src/spice-gtk-session.c |   21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

New commits:
commit 172c521271a3dc6d9ed0c297406c2fa29266682d
Author: Victor Toso <me at victortoso.com>
Date:   Fri Feb 24 14:12:45 2017 +0100

    gtk-session: always reply to agent's clipboard request
    
    This fixes a regression from 7b0de6217670e0f668aff2949f
    
    We need to reply back to the agent all clipboard requests even in case
    of failure otherwise it will have a pending request. The following
    error message can be seen afterwards, in the linux agent, when client
    sends down some clipboard data:
    
     > clipboard: selection requests pending on clipboard ownership
     > change, clearing
    
    An easy way to reproduce this is:
    1-) In client, copy image from lo-draw (selection or ctrl+c)
    2-) In guest, paste it to GEdit (mouse3 our ctrl+v)
    3-) Move to the client
    4-) Move back to the guest
    5-) see error on vdagent logs
    
    The reason for failure is that client's clipboard contains different
    data type (image) then what was requested from guest's editor (text)
    
    While at it, include extra debug message as it might be hard to
    identify why clipboard did not work.
    
    Resolves: rhbz#1409854
    Signed-off-by: Victor Toso <victortoso at redhat.com>
    Acked-by: Pavel Grunt <pgrunt at redhat.com>

diff --git a/src/spice-gtk-session.c b/src/spice-gtk-session.c
index 0426d8f..fbb7c82 100644
--- a/src/spice-gtk-session.c
+++ b/src/spice-gtk-session.c
@@ -936,35 +936,40 @@ static void clipboard_received_text_cb(GtkClipboard *clipboard,
     char *conv = NULL;
     int len = 0;
     int selection;
+    const guchar *data = NULL;
 
     if (self == NULL)
         return;
 
+    selection = get_selection_from_clipboard(self->priv, clipboard);
+    g_return_if_fail(selection != -1);
+
     if (text == NULL) {
         SPICE_DEBUG("Failed to retrieve clipboard text");
-        return;
+        goto notify_agent;
     }
 
     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;
+        SPICE_DEBUG("Failed size limits of clipboard text (%d bytes)", len);
+        goto notify_agent;
     }
 
     /* gtk+ internal utf8 newline is always LF, even on windows */
     conv = fixup_clipboard_text(self, text, &len);
     if (!check_clipboard_size_limits(self, len)) {
-        g_free(conv);
-        return;
+        SPICE_DEBUG("Failed size limits of clipboard text (%d bytes)", len);
+        goto notify_agent;
     }
 
+    data = (const guchar *) (conv != NULL ? conv : text);
+notify_agent:
     spice_main_clipboard_selection_notify(self->priv->main, selection,
                                           VD_AGENT_CLIPBOARD_UTF8_TEXT,
-                                          (guchar *)(conv ?: text), len);
+                                          data,
+                                          (data != NULL) ? len : 0);
     g_free(conv);
 }
 


More information about the Spice-commits mailing list