Blob Blame History Raw
From 1d349aa519571199d10d38b0a0e2f91b051ab3c8 Mon Sep 17 00:00:00 2001
From: Victor Toso <me@victortoso.com>
Date: Fri, 24 Feb 2017 14:12:45 +0100
Subject: [PATCH spice-gtk 2/2] gtk-session: always reply to agent's clipboard
 request
To: spice-devel@lists.freedesktop.org

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@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
(cherry picked from commit 172c521271a3dc6d9ed0c297406c2fa29266682d)
---
 src/spice-gtk-session.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/src/spice-gtk-session.c b/src/spice-gtk-session.c
index 6424596..c0a46e8 100644
--- a/src/spice-gtk-session.c
+++ b/src/spice-gtk-session.c
@@ -931,35 +931,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);
 }
 
-- 
2.12.0