All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 00/18] Clipboard fixes (for 6.1?)
@ 2021-08-05 13:56 marcandre.lureau
  2021-08-05 13:56 ` [PATCH v3 01/18] ui/vdagent: fix leak on error path marcandre.lureau
                   ` (18 more replies)
  0 siblings, 19 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Hi,

Here is a few fixes I have collected while working on clipboard-related code.

There are some obvious code improvements/fixes, and better handling of release &
unregister to avoid dangling pointers and improve user experience.

v3:
 - add a migration blocker
 - improve the code by using a few helpers

v2:
 - replaced "ui/vdagent: unregister clipboard peer on finalize" with "ui/vdagent: disconnect handlers and reset state on finalize" patch.
 - added "ui/vdagent: reset outbuf on disconnect"
 - commit message tweaks

Marc-André Lureau (18):
  ui/vdagent: fix leak on error path
  ui/vdagent: remove copy-pasta comment
  ui/gtk-clipboard: use existing macros
  ui/gtk-clipboard: fix clipboard enum typo
  ui/clipboard: add helper to retrieve current clipboard
  ui/clipboard: add qemu_clipboard_peer_owns() helper
  ui/clipboard: add qemu_clipboard_peer_release() helper
  ui/clipboard: release owned grabs on unregister
  ui/vdagent: disconnect handlers and reset state on finalize
  ui/vdagent: reset outbuf on disconnect
  ui/vdagent: split clipboard recv message handling
  ui/vdagent: use qemu_clipboard_peer_release helper
  ui/vdagent: use qemu_clipboard_info helper
  ui/vdagent: send empty clipboard when unhandled
  ui/gtk-clipboard: use qemu_clipboard_info helper
  ui/vdagent: send release when no clipboard owner
  ui/gtk-clipboard: emit release clipboard events
  ui/vdagent: add a migration blocker

 include/ui/clipboard.h |  33 ++++++
 include/ui/gtk.h       |   1 -
 ui/clipboard.c         |  41 +++++++
 ui/gtk-clipboard.c     |  24 ++---
 ui/vdagent.c           | 239 ++++++++++++++++++++++++++---------------
 ui/trace-events        |   1 +
 6 files changed, 240 insertions(+), 99 deletions(-)

-- 
2.32.0.264.g75ae10bc75




^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH v3 01/18] ui/vdagent: fix leak on error path
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
@ 2021-08-05 13:56 ` marcandre.lureau
  2021-08-27 13:29   ` Philippe Mathieu-Daudé
  2021-08-05 13:56 ` [PATCH v3 02/18] ui/vdagent: remove copy-pasta comment marcandre.lureau
                   ` (17 subsequent siblings)
  18 siblings, 1 reply; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

"info" was leaked when more than 10 entries.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/ui/clipboard.h | 2 ++
 ui/vdagent.c           | 4 +---
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/ui/clipboard.h b/include/ui/clipboard.h
index b45b984c9f..eb789a285a 100644
--- a/include/ui/clipboard.h
+++ b/include/ui/clipboard.h
@@ -190,4 +190,6 @@ void qemu_clipboard_set_data(QemuClipboardPeer *peer,
                              const void *data,
                              bool update);
 
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(QemuClipboardInfo, qemu_clipboard_info_unref)
+
 #endif /* QEMU_CLIPBOARD_H */
diff --git a/ui/vdagent.c b/ui/vdagent.c
index a253a8fe63..f6ef8d1993 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -438,7 +438,7 @@ static void vdagent_chr_recv_clipboard(VDAgentChardev *vd, VDAgentMessage *msg)
     uint8_t s = VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD;
     uint32_t size = msg->size;
     void *data = msg->data;
-    QemuClipboardInfo *info;
+    g_autoptr(QemuClipboardInfo) info = NULL;
     QemuClipboardType type;
 
     if (have_selection(vd)) {
@@ -477,7 +477,6 @@ static void vdagent_chr_recv_clipboard(VDAgentChardev *vd, VDAgentMessage *msg)
             size -= sizeof(uint32_t);
         }
         qemu_clipboard_update(info);
-        qemu_clipboard_info_unref(info);
         break;
     case VD_AGENT_CLIPBOARD_REQUEST:
         if (size < sizeof(uint32_t)) {
@@ -523,7 +522,6 @@ static void vdagent_chr_recv_clipboard(VDAgentChardev *vd, VDAgentMessage *msg)
             /* set empty clipboard info */
             info = qemu_clipboard_info_new(NULL, s);
             qemu_clipboard_update(info);
-            qemu_clipboard_info_unref(info);
         }
         break;
     }
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 02/18] ui/vdagent: remove copy-pasta comment
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
  2021-08-05 13:56 ` [PATCH v3 01/18] ui/vdagent: fix leak on error path marcandre.lureau
@ 2021-08-05 13:56 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 03/18] ui/gtk-clipboard: use existing macros marcandre.lureau
                   ` (16 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index f6ef8d1993..5ae5734c81 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -516,7 +516,7 @@ static void vdagent_chr_recv_clipboard(VDAgentChardev *vd, VDAgentMessage *msg)
         qemu_clipboard_set_data(&vd->cbpeer, vd->cbinfo[s], type,
                                 size, data, true);
         break;
-    case VD_AGENT_CLIPBOARD_RELEASE: /* data */
+    case VD_AGENT_CLIPBOARD_RELEASE:
         if (vd->cbinfo[s] &&
             vd->cbinfo[s]->owner == &vd->cbpeer) {
             /* set empty clipboard info */
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 03/18] ui/gtk-clipboard: use existing macros
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
  2021-08-05 13:56 ` [PATCH v3 01/18] ui/vdagent: fix leak on error path marcandre.lureau
  2021-08-05 13:56 ` [PATCH v3 02/18] ui/vdagent: remove copy-pasta comment marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 04/18] ui/gtk-clipboard: fix clipboard enum typo marcandre.lureau
                   ` (15 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Hardcoding strings is error prone, use dedicated macros instead.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/gtk-clipboard.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/ui/gtk-clipboard.c b/ui/gtk-clipboard.c
index bff28d2030..5e817ae55c 100644
--- a/ui/gtk-clipboard.c
+++ b/ui/gtk-clipboard.c
@@ -177,11 +177,11 @@ void gd_clipboard_init(GtkDisplayState *gd)
     qemu_clipboard_peer_register(&gd->cbpeer);
 
     gd->gtkcb[QEMU_CLIPBOARD_SELECTION_CLIPBOARD] =
-        gtk_clipboard_get(gdk_atom_intern("CLIPBOARD", FALSE));
+        gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
     gd->gtkcb[QEMU_CLIPBOARD_SELECTION_PRIMARY] =
-        gtk_clipboard_get(gdk_atom_intern("PRIMARY", FALSE));
+        gtk_clipboard_get(GDK_SELECTION_PRIMARY);
     gd->gtkcb[QEMU_CLIPBOARD_SELECTION_SECONDARY] =
-        gtk_clipboard_get(gdk_atom_intern("SECONDARY", FALSE));
+        gtk_clipboard_get(GDK_SELECTION_SECONDARY);
 
     g_signal_connect(gd->gtkcb[QEMU_CLIPBOARD_SELECTION_CLIPBOARD],
                      "owner-change", G_CALLBACK(gd_owner_change), gd);
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 04/18] ui/gtk-clipboard: fix clipboard enum typo
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (2 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 03/18] ui/gtk-clipboard: use existing macros marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 05/18] ui/clipboard: add helper to retrieve current clipboard marcandre.lureau
                   ` (14 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/gtk-clipboard.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ui/gtk-clipboard.c b/ui/gtk-clipboard.c
index 5e817ae55c..2c78de9500 100644
--- a/ui/gtk-clipboard.c
+++ b/ui/gtk-clipboard.c
@@ -155,7 +155,7 @@ static void gd_owner_change(GtkClipboard *clipboard,
 
 
     switch (event->owner_change.reason) {
-    case GDK_SETTING_ACTION_NEW:
+    case GDK_OWNER_CHANGE_NEW_OWNER:
         info = qemu_clipboard_info_new(&gd->cbpeer, s);
         if (gtk_clipboard_wait_is_text_available(clipboard)) {
             info->types[QEMU_CLIPBOARD_TYPE_TEXT].available = true;
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 05/18] ui/clipboard: add helper to retrieve current clipboard
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (3 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 04/18] ui/gtk-clipboard: fix clipboard enum typo marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 06/18] ui/clipboard: add qemu_clipboard_peer_owns() helper marcandre.lureau
                   ` (13 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/ui/clipboard.h |  9 +++++++++
 ui/clipboard.c         | 15 +++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/include/ui/clipboard.h b/include/ui/clipboard.h
index eb789a285a..e9fcb15c66 100644
--- a/include/ui/clipboard.h
+++ b/include/ui/clipboard.h
@@ -109,6 +109,15 @@ void qemu_clipboard_peer_register(QemuClipboardPeer *peer);
  */
 void qemu_clipboard_peer_unregister(QemuClipboardPeer *peer);
 
+/**
+ * qemu_clipboard_info
+ *
+ * @selection: clipboard selection.
+ *
+ * Return the current clipboard data & owner informations.
+ */
+QemuClipboardInfo *qemu_clipboard_info(QemuClipboardSelection selection);
+
 /**
  * qemu_clipboard_info_new
  *
diff --git a/ui/clipboard.c b/ui/clipboard.c
index 3525b30178..56c14509fe 100644
--- a/ui/clipboard.c
+++ b/ui/clipboard.c
@@ -4,6 +4,8 @@
 static NotifierList clipboard_notifiers =
     NOTIFIER_LIST_INITIALIZER(clipboard_notifiers);
 
+static QemuClipboardInfo *cbinfo[QEMU_CLIPBOARD_SELECTION__COUNT];
+
 void qemu_clipboard_peer_register(QemuClipboardPeer *peer)
 {
     notifier_list_add(&clipboard_notifiers, &peer->update);
@@ -16,7 +18,20 @@ void qemu_clipboard_peer_unregister(QemuClipboardPeer *peer)
 
 void qemu_clipboard_update(QemuClipboardInfo *info)
 {
+    g_autoptr(QemuClipboardInfo) old = NULL;
+    assert(info->selection < QEMU_CLIPBOARD_SELECTION__COUNT);
+
     notifier_list_notify(&clipboard_notifiers, info);
+
+    old = cbinfo[info->selection];
+    cbinfo[info->selection] = qemu_clipboard_info_ref(info);
+}
+
+QemuClipboardInfo *qemu_clipboard_info(QemuClipboardSelection selection)
+{
+    assert(selection < QEMU_CLIPBOARD_SELECTION__COUNT);
+
+    return cbinfo[selection];
 }
 
 QemuClipboardInfo *qemu_clipboard_info_new(QemuClipboardPeer *owner,
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 06/18] ui/clipboard: add qemu_clipboard_peer_owns() helper
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (4 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 05/18] ui/clipboard: add helper to retrieve current clipboard marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 07/18] ui/clipboard: add qemu_clipboard_peer_release() helper marcandre.lureau
                   ` (12 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/ui/clipboard.h | 11 +++++++++++
 ui/clipboard.c         |  8 ++++++++
 2 files changed, 19 insertions(+)

diff --git a/include/ui/clipboard.h b/include/ui/clipboard.h
index e9fcb15c66..25e0b470c8 100644
--- a/include/ui/clipboard.h
+++ b/include/ui/clipboard.h
@@ -109,6 +109,17 @@ void qemu_clipboard_peer_register(QemuClipboardPeer *peer);
  */
 void qemu_clipboard_peer_unregister(QemuClipboardPeer *peer);
 
+/**
+ * qemu_clipboard_peer_owns
+ *
+ * @peer: peer information.
+ * @selection: clipboard selection.
+ *
+ * Return TRUE if the peer owns the clipboard.
+ */
+bool qemu_clipboard_peer_owns(QemuClipboardPeer *peer,
+                              QemuClipboardSelection selection);
+
 /**
  * qemu_clipboard_info
  *
diff --git a/ui/clipboard.c b/ui/clipboard.c
index 56c14509fe..490c3220f4 100644
--- a/ui/clipboard.c
+++ b/ui/clipboard.c
@@ -16,6 +16,14 @@ void qemu_clipboard_peer_unregister(QemuClipboardPeer *peer)
     notifier_remove(&peer->update);
 }
 
+bool qemu_clipboard_peer_owns(QemuClipboardPeer *peer,
+                              QemuClipboardSelection selection)
+{
+    QemuClipboardInfo *info = qemu_clipboard_info(selection);
+
+    return info && info->owner == peer;
+}
+
 void qemu_clipboard_update(QemuClipboardInfo *info)
 {
     g_autoptr(QemuClipboardInfo) old = NULL;
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 07/18] ui/clipboard: add qemu_clipboard_peer_release() helper
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (5 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 06/18] ui/clipboard: add qemu_clipboard_peer_owns() helper marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 08/18] ui/clipboard: release owned grabs on unregister marcandre.lureau
                   ` (11 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/ui/clipboard.h | 11 +++++++++++
 ui/clipboard.c         | 12 ++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/include/ui/clipboard.h b/include/ui/clipboard.h
index 25e0b470c8..6298986b15 100644
--- a/include/ui/clipboard.h
+++ b/include/ui/clipboard.h
@@ -120,6 +120,17 @@ void qemu_clipboard_peer_unregister(QemuClipboardPeer *peer);
 bool qemu_clipboard_peer_owns(QemuClipboardPeer *peer,
                               QemuClipboardSelection selection);
 
+/**
+ * qemu_clipboard_peer_release
+ *
+ * @peer: peer information.
+ * @selection: clipboard selection.
+ *
+ * If the peer owns the clipboard, release it.
+ */
+void qemu_clipboard_peer_release(QemuClipboardPeer *peer,
+                                 QemuClipboardSelection selection);
+
 /**
  * qemu_clipboard_info
  *
diff --git a/ui/clipboard.c b/ui/clipboard.c
index 490c3220f4..c277247a7f 100644
--- a/ui/clipboard.c
+++ b/ui/clipboard.c
@@ -24,6 +24,18 @@ bool qemu_clipboard_peer_owns(QemuClipboardPeer *peer,
     return info && info->owner == peer;
 }
 
+void qemu_clipboard_peer_release(QemuClipboardPeer *peer,
+                                 QemuClipboardSelection selection)
+{
+    g_autoptr(QemuClipboardInfo) info = NULL;
+
+    if (qemu_clipboard_peer_owns(peer, selection)) {
+        /* set empty clipboard info */
+        info = qemu_clipboard_info_new(NULL, selection);
+        qemu_clipboard_update(info);
+    }
+}
+
 void qemu_clipboard_update(QemuClipboardInfo *info)
 {
     g_autoptr(QemuClipboardInfo) old = NULL;
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 08/18] ui/clipboard: release owned grabs on unregister
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (6 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 07/18] ui/clipboard: add qemu_clipboard_peer_release() helper marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 09/18] ui/vdagent: disconnect handlers and reset state on finalize marcandre.lureau
                   ` (10 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/clipboard.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/ui/clipboard.c b/ui/clipboard.c
index c277247a7f..d7b008d62a 100644
--- a/ui/clipboard.c
+++ b/ui/clipboard.c
@@ -13,6 +13,12 @@ void qemu_clipboard_peer_register(QemuClipboardPeer *peer)
 
 void qemu_clipboard_peer_unregister(QemuClipboardPeer *peer)
 {
+    int i;
+
+    for (i = 0; i < QEMU_CLIPBOARD_SELECTION__COUNT; i++) {
+        qemu_clipboard_peer_release(peer, i);
+    }
+
     notifier_remove(&peer->update);
 }
 
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 09/18] ui/vdagent: disconnect handlers and reset state on finalize
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (7 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 08/18] ui/clipboard: release owned grabs on unregister marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-27 13:33   ` Philippe Mathieu-Daudé
  2021-08-05 13:57 ` [PATCH v3 10/18] ui/vdagent: reset outbuf on disconnect marcandre.lureau
                   ` (9 subsequent siblings)
  18 siblings, 1 reply; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Avoid handlers being called with dangling pointers when the object is
freed.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index 5ae5734c81..1a29016e07 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -721,22 +721,26 @@ static void vdagent_chr_accept_input(Chardev *chr)
     vdagent_send_buf(vd);
 }
 
+static void vdagent_disconnect(VDAgentChardev *vd)
+{
+    vdagent_reset_bufs(vd);
+    vd->caps = 0;
+    if (vd->mouse_hs) {
+        qemu_input_handler_deactivate(vd->mouse_hs);
+    }
+    if (vd->cbpeer.update.notify) {
+        qemu_clipboard_peer_unregister(&vd->cbpeer);
+        memset(&vd->cbpeer, 0, sizeof(vd->cbpeer));
+    }
+}
+
 static void vdagent_chr_set_fe_open(struct Chardev *chr, int fe_open)
 {
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(chr);
 
     if (!fe_open) {
         trace_vdagent_close();
-        /* reset state */
-        vdagent_reset_bufs(vd);
-        vd->caps = 0;
-        if (vd->mouse_hs) {
-            qemu_input_handler_deactivate(vd->mouse_hs);
-        }
-        if (vd->cbpeer.update.notify) {
-            qemu_clipboard_peer_unregister(&vd->cbpeer);
-            memset(&vd->cbpeer, 0, sizeof(vd->cbpeer));
-        }
+        vdagent_disconnect(vd);
         return;
     }
 
@@ -781,6 +785,7 @@ static void vdagent_chr_fini(Object *obj)
 {
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
 
+    vdagent_disconnect(vd);
     buffer_free(&vd->outbuf);
 }
 
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 10/18] ui/vdagent: reset outbuf on disconnect
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (8 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 09/18] ui/vdagent: disconnect handlers and reset state on finalize marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 11/18] ui/vdagent: split clipboard recv message handling marcandre.lureau
                   ` (8 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index 1a29016e07..3770c58b6c 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -723,6 +723,7 @@ static void vdagent_chr_accept_input(Chardev *chr)
 
 static void vdagent_disconnect(VDAgentChardev *vd)
 {
+    buffer_reset(&vd->outbuf);
     vdagent_reset_bufs(vd);
     vd->caps = 0;
     if (vd->mouse_hs) {
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 11/18] ui/vdagent: split clipboard recv message handling
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (9 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 10/18] ui/vdagent: reset outbuf on disconnect marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 12/18] ui/vdagent: use qemu_clipboard_peer_release helper marcandre.lureau
                   ` (7 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 157 +++++++++++++++++++++++++++++----------------------
 1 file changed, 89 insertions(+), 68 deletions(-)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index 3770c58b6c..362064213c 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -433,13 +433,94 @@ static void vdagent_clipboard_request(QemuClipboardInfo *info,
     vdagent_send_msg(vd, msg);
 }
 
+static void vdagent_clipboard_recv_grab(VDAgentChardev *vd, uint8_t s, uint32_t size, void *data)
+{
+    g_autoptr(QemuClipboardInfo) info = NULL;
+
+    trace_vdagent_cb_grab_selection(GET_NAME(sel_name, s));
+    info = qemu_clipboard_info_new(&vd->cbpeer, s);
+    if (size > sizeof(uint32_t) * 10) {
+        /*
+         * spice has 6 types as of 2021. Limiting to 10 entries
+         * so we we have some wiggle room.
+         */
+        return;
+    }
+    while (size >= sizeof(uint32_t)) {
+        trace_vdagent_cb_grab_type(GET_NAME(type_name, *(uint32_t *)data));
+        switch (*(uint32_t *)data) {
+        case VD_AGENT_CLIPBOARD_UTF8_TEXT:
+            info->types[QEMU_CLIPBOARD_TYPE_TEXT].available = true;
+            break;
+        default:
+            break;
+        }
+        data += sizeof(uint32_t);
+        size -= sizeof(uint32_t);
+    }
+    qemu_clipboard_update(info);
+}
+
+static void vdagent_clipboard_recv_request(VDAgentChardev *vd, uint8_t s, uint32_t size, void *data)
+{
+    QemuClipboardType type;
+
+    if (size < sizeof(uint32_t)) {
+        return;
+    }
+    switch (*(uint32_t *)data) {
+    case VD_AGENT_CLIPBOARD_UTF8_TEXT:
+        type = QEMU_CLIPBOARD_TYPE_TEXT;
+        break;
+    default:
+        return;
+    }
+    if (vd->cbinfo[s] && vd->cbinfo[s]->types[type].available &&
+        vd->cbinfo[s]->owner != &vd->cbpeer) {
+        if (vd->cbinfo[s]->types[type].data) {
+            vdagent_send_clipboard_data(vd, vd->cbinfo[s], type);
+        } else {
+            vd->cbpending[s] |= (1 << type);
+            qemu_clipboard_request(vd->cbinfo[s], type);
+        }
+    }
+}
+
+static void vdagent_clipboard_recv_data(VDAgentChardev *vd, uint8_t s, uint32_t size, void *data)
+{
+    QemuClipboardType type;
+
+    if (size < sizeof(uint32_t)) {
+        return;
+    }
+    switch (*(uint32_t *)data) {
+    case VD_AGENT_CLIPBOARD_UTF8_TEXT:
+        type = QEMU_CLIPBOARD_TYPE_TEXT;
+        break;
+    default:
+        return;
+    }
+    data += 4;
+    size -= 4;
+    qemu_clipboard_set_data(&vd->cbpeer, vd->cbinfo[s], type, size, data, true);
+}
+
+static void vdagent_clipboard_recv_release(VDAgentChardev *vd, uint8_t s)
+{
+    g_autoptr(QemuClipboardInfo) info = NULL;
+
+    if (vd->cbinfo[s] && vd->cbinfo[s]->owner == &vd->cbpeer) {
+        /* set empty clipboard info */
+        info = qemu_clipboard_info_new(NULL, s);
+        qemu_clipboard_update(info);
+    }
+}
+
 static void vdagent_chr_recv_clipboard(VDAgentChardev *vd, VDAgentMessage *msg)
 {
     uint8_t s = VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD;
     uint32_t size = msg->size;
     void *data = msg->data;
-    g_autoptr(QemuClipboardInfo) info = NULL;
-    QemuClipboardType type;
 
     if (have_selection(vd)) {
         if (size < 4) {
@@ -455,75 +536,15 @@ static void vdagent_chr_recv_clipboard(VDAgentChardev *vd, VDAgentMessage *msg)
 
     switch (msg->type) {
     case VD_AGENT_CLIPBOARD_GRAB:
-        trace_vdagent_cb_grab_selection(GET_NAME(sel_name, s));
-        info = qemu_clipboard_info_new(&vd->cbpeer, s);
-        if (size > sizeof(uint32_t) * 10) {
-            /*
-             * spice has 6 types as of 2021. Limiting to 10 entries
-             * so we we have some wiggle room.
-             */
-            return;
-        }
-        while (size >= sizeof(uint32_t)) {
-            trace_vdagent_cb_grab_type(GET_NAME(type_name, *(uint32_t *)data));
-            switch (*(uint32_t *)data) {
-            case VD_AGENT_CLIPBOARD_UTF8_TEXT:
-                info->types[QEMU_CLIPBOARD_TYPE_TEXT].available = true;
-                break;
-            default:
-                break;
-            }
-            data += sizeof(uint32_t);
-            size -= sizeof(uint32_t);
-        }
-        qemu_clipboard_update(info);
-        break;
+        return vdagent_clipboard_recv_grab(vd, s, size, data);
     case VD_AGENT_CLIPBOARD_REQUEST:
-        if (size < sizeof(uint32_t)) {
-            return;
-        }
-        switch (*(uint32_t *)data) {
-        case VD_AGENT_CLIPBOARD_UTF8_TEXT:
-            type = QEMU_CLIPBOARD_TYPE_TEXT;
-            break;
-        default:
-            return;
-        }
-        if (vd->cbinfo[s] &&
-            vd->cbinfo[s]->types[type].available &&
-            vd->cbinfo[s]->owner != &vd->cbpeer) {
-            if (vd->cbinfo[s]->types[type].data) {
-                vdagent_send_clipboard_data(vd, vd->cbinfo[s], type);
-            } else {
-                vd->cbpending[s] |= (1 << type);
-                qemu_clipboard_request(vd->cbinfo[s], type);
-            }
-        }
-        break;
+        return vdagent_clipboard_recv_request(vd, s, size, data);
     case VD_AGENT_CLIPBOARD: /* data */
-        if (size < sizeof(uint32_t)) {
-            return;
-        }
-        switch (*(uint32_t *)data) {
-        case VD_AGENT_CLIPBOARD_UTF8_TEXT:
-            type = QEMU_CLIPBOARD_TYPE_TEXT;
-            break;
-        default:
-            return;
-        }
-        data += 4;
-        size -= 4;
-        qemu_clipboard_set_data(&vd->cbpeer, vd->cbinfo[s], type,
-                                size, data, true);
-        break;
+        return vdagent_clipboard_recv_data(vd, s, size, data);
     case VD_AGENT_CLIPBOARD_RELEASE:
-        if (vd->cbinfo[s] &&
-            vd->cbinfo[s]->owner == &vd->cbpeer) {
-            /* set empty clipboard info */
-            info = qemu_clipboard_info_new(NULL, s);
-            qemu_clipboard_update(info);
-        }
-        break;
+        return vdagent_clipboard_recv_release(vd, s);
+    default:
+        g_assert_not_reached();
     }
 }
 
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 12/18] ui/vdagent: use qemu_clipboard_peer_release helper
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (10 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 11/18] ui/vdagent: split clipboard recv message handling marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 13/18] ui/vdagent: use qemu_clipboard_info helper marcandre.lureau
                   ` (6 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index 362064213c..99ba34646f 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -507,13 +507,7 @@ static void vdagent_clipboard_recv_data(VDAgentChardev *vd, uint8_t s, uint32_t
 
 static void vdagent_clipboard_recv_release(VDAgentChardev *vd, uint8_t s)
 {
-    g_autoptr(QemuClipboardInfo) info = NULL;
-
-    if (vd->cbinfo[s] && vd->cbinfo[s]->owner == &vd->cbpeer) {
-        /* set empty clipboard info */
-        info = qemu_clipboard_info_new(NULL, s);
-        qemu_clipboard_update(info);
-    }
+    qemu_clipboard_peer_release(&vd->cbpeer, s);
 }
 
 static void vdagent_chr_recv_clipboard(VDAgentChardev *vd, VDAgentMessage *msg)
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 13/18] ui/vdagent: use qemu_clipboard_info helper
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (11 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 12/18] ui/vdagent: use qemu_clipboard_peer_release helper marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 14/18] ui/vdagent: send empty clipboard when unhandled marcandre.lureau
                   ` (5 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The clipboard unit now tracks the current clipboard grab, no need to
duplicate this work.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index 99ba34646f..cd07937a4b 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -47,7 +47,6 @@ struct VDAgentChardev {
 
     /* clipboard */
     QemuClipboardPeer cbpeer;
-    QemuClipboardInfo *cbinfo[QEMU_CLIPBOARD_SELECTION__COUNT];
     uint32_t cbpending[QEMU_CLIPBOARD_SELECTION__COUNT];
 };
 typedef struct VDAgentChardev VDAgentChardev;
@@ -384,9 +383,7 @@ static void vdagent_clipboard_notify(Notifier *notifier, void *data)
     QemuClipboardType type;
     bool self_update = info->owner == &vd->cbpeer;
 
-    if (info != vd->cbinfo[s]) {
-        qemu_clipboard_info_unref(vd->cbinfo[s]);
-        vd->cbinfo[s] = qemu_clipboard_info_ref(info);
+    if (info != qemu_clipboard_info(s)) {
         vd->cbpending[s] = 0;
         if (!self_update) {
             vdagent_send_clipboard_grab(vd, info);
@@ -464,6 +461,7 @@ static void vdagent_clipboard_recv_grab(VDAgentChardev *vd, uint8_t s, uint32_t
 static void vdagent_clipboard_recv_request(VDAgentChardev *vd, uint8_t s, uint32_t size, void *data)
 {
     QemuClipboardType type;
+    QemuClipboardInfo *info;
 
     if (size < sizeof(uint32_t)) {
         return;
@@ -475,13 +473,14 @@ static void vdagent_clipboard_recv_request(VDAgentChardev *vd, uint8_t s, uint32
     default:
         return;
     }
-    if (vd->cbinfo[s] && vd->cbinfo[s]->types[type].available &&
-        vd->cbinfo[s]->owner != &vd->cbpeer) {
-        if (vd->cbinfo[s]->types[type].data) {
-            vdagent_send_clipboard_data(vd, vd->cbinfo[s], type);
+
+    info = qemu_clipboard_info(s);
+    if (info && info->types[type].available && info->owner != &vd->cbpeer) {
+        if (info->types[type].data) {
+            vdagent_send_clipboard_data(vd, info, type);
         } else {
             vd->cbpending[s] |= (1 << type);
-            qemu_clipboard_request(vd->cbinfo[s], type);
+            qemu_clipboard_request(info, type);
         }
     }
 }
@@ -502,7 +501,11 @@ static void vdagent_clipboard_recv_data(VDAgentChardev *vd, uint8_t s, uint32_t
     }
     data += 4;
     size -= 4;
-    qemu_clipboard_set_data(&vd->cbpeer, vd->cbinfo[s], type, size, data, true);
+
+    if (qemu_clipboard_peer_owns(&vd->cbpeer, s)) {
+        qemu_clipboard_set_data(&vd->cbpeer, qemu_clipboard_info(s),
+                                type, size, data, true);
+    }
 }
 
 static void vdagent_clipboard_recv_release(VDAgentChardev *vd, uint8_t s)
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 14/18] ui/vdagent: send empty clipboard when unhandled
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (12 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 13/18] ui/vdagent: use qemu_clipboard_info helper marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 15/18] ui/gtk-clipboard: use qemu_clipboard_info helper marcandre.lureau
                   ` (4 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Rather than leaving the agent timing out or hanging, reply to it with an
empty result.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c    | 12 ++++++++++++
 ui/trace-events |  1 +
 2 files changed, 13 insertions(+)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index cd07937a4b..cd49da1ffa 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -375,6 +375,16 @@ static void vdagent_send_clipboard_data(VDAgentChardev *vd,
     vdagent_send_msg(vd, msg);
 }
 
+static void vdagent_send_empty_clipboard_data(VDAgentChardev *vd,
+                                              QemuClipboardSelection selection,
+                                              QemuClipboardType type)
+{
+    g_autoptr(QemuClipboardInfo) info = qemu_clipboard_info_new(&vd->cbpeer, selection);
+
+    trace_vdagent_send_empty_clipboard();
+    vdagent_send_clipboard_data(vd, info, type);
+}
+
 static void vdagent_clipboard_notify(Notifier *notifier, void *data)
 {
     VDAgentChardev *vd = container_of(notifier, VDAgentChardev, cbpeer.update);
@@ -482,6 +492,8 @@ static void vdagent_clipboard_recv_request(VDAgentChardev *vd, uint8_t s, uint32
             vd->cbpending[s] |= (1 << type);
             qemu_clipboard_request(info, type);
         }
+    } else {
+        vdagent_send_empty_clipboard_data(vd, s, type);
     }
 }
 
diff --git a/ui/trace-events b/ui/trace-events
index 1b5f87bc09..b9c0dd0fa1 100644
--- a/ui/trace-events
+++ b/ui/trace-events
@@ -129,6 +129,7 @@ xkeymap_keymap(const char *name) "keymap '%s'"
 vdagent_open(void) ""
 vdagent_close(void) ""
 vdagent_send(const char *name) "msg %s"
+vdagent_send_empty_clipboard(void) ""
 vdagent_recv_chunk(uint32_t size) "size %d"
 vdagent_recv_msg(const char *name, uint32_t size) "msg %s, size %d"
 vdagent_peer_cap(const char *name) "cap %s"
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 15/18] ui/gtk-clipboard: use qemu_clipboard_info helper
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (13 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 14/18] ui/vdagent: send empty clipboard when unhandled marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 16/18] ui/vdagent: send release when no clipboard owner marcandre.lureau
                   ` (3 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/ui/gtk.h   |  1 -
 ui/gtk-clipboard.c | 14 ++++++--------
 2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/include/ui/gtk.h b/include/ui/gtk.h
index 80d6bbd9b5..7835ef1a71 100644
--- a/include/ui/gtk.h
+++ b/include/ui/gtk.h
@@ -143,7 +143,6 @@ struct GtkDisplayState {
     bool external_pause_update;
 
     QemuClipboardPeer cbpeer;
-    QemuClipboardInfo *cbinfo[QEMU_CLIPBOARD_SELECTION__COUNT];
     uint32_t cbpending[QEMU_CLIPBOARD_SELECTION__COUNT];
     GtkClipboard *gtkcb[QEMU_CLIPBOARD_SELECTION__COUNT];
     bool cbowner[QEMU_CLIPBOARD_SELECTION__COUNT];
diff --git a/ui/gtk-clipboard.c b/ui/gtk-clipboard.c
index 2c78de9500..4e4b3c52bb 100644
--- a/ui/gtk-clipboard.c
+++ b/ui/gtk-clipboard.c
@@ -45,24 +45,24 @@ static void gd_clipboard_get_data(GtkClipboard     *clipboard,
     GtkDisplayState *gd = data;
     QemuClipboardSelection s = gd_find_selection(gd, clipboard);
     QemuClipboardType type = QEMU_CLIPBOARD_TYPE_TEXT;
-    QemuClipboardInfo *info = qemu_clipboard_info_ref(gd->cbinfo[s]);
+    g_autoptr(QemuClipboardInfo) info = NULL;
+
+    info = qemu_clipboard_info_ref(qemu_clipboard_info(s));
 
     qemu_clipboard_request(info, type);
-    while (info == gd->cbinfo[s] &&
+    while (info == qemu_clipboard_info(s) &&
            info->types[type].available &&
            info->types[type].data == NULL) {
         main_loop_wait(false);
     }
 
-    if (info == gd->cbinfo[s] && gd->cbowner[s]) {
+    if (info == qemu_clipboard_info(s) && gd->cbowner[s]) {
         gtk_selection_data_set_text(selection_data,
                                     info->types[type].data,
                                     info->types[type].size);
     } else {
         /* clipboard owner changed while waiting for the data */
     }
-
-    qemu_clipboard_info_unref(info);
 }
 
 static void gd_clipboard_clear(GtkClipboard *clipboard,
@@ -81,9 +81,7 @@ static void gd_clipboard_notify(Notifier *notifier, void *data)
     QemuClipboardSelection s = info->selection;
     bool self_update = info->owner == &gd->cbpeer;
 
-    if (info != gd->cbinfo[s]) {
-        qemu_clipboard_info_unref(gd->cbinfo[s]);
-        gd->cbinfo[s] = qemu_clipboard_info_ref(info);
+    if (info != qemu_clipboard_info(s)) {
         gd->cbpending[s] = 0;
         if (!self_update) {
             GtkTargetList *list;
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 16/18] ui/vdagent: send release when no clipboard owner
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (14 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 15/18] ui/gtk-clipboard: use qemu_clipboard_info helper marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 17/18] ui/gtk-clipboard: emit release clipboard events marcandre.lureau
                   ` (2 subsequent siblings)
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index cd49da1ffa..7d8cb963ff 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -345,6 +345,24 @@ static void vdagent_send_clipboard_grab(VDAgentChardev *vd,
     vdagent_send_msg(vd, msg);
 }
 
+static void vdagent_send_clipboard_release(VDAgentChardev *vd,
+                                           QemuClipboardInfo *info)
+{
+    g_autofree VDAgentMessage *msg = g_malloc0(sizeof(VDAgentMessage) +
+                                               sizeof(uint32_t));
+
+    if (have_selection(vd)) {
+        uint8_t *s = msg->data;
+        *s = info->selection;
+        msg->size += sizeof(uint32_t);
+    } else if (info->selection != QEMU_CLIPBOARD_SELECTION_CLIPBOARD) {
+        return;
+    }
+
+    msg->type = VD_AGENT_CLIPBOARD_RELEASE;
+    vdagent_send_msg(vd, msg);
+}
+
 static void vdagent_send_clipboard_data(VDAgentChardev *vd,
                                         QemuClipboardInfo *info,
                                         QemuClipboardType type)
@@ -396,7 +414,11 @@ static void vdagent_clipboard_notify(Notifier *notifier, void *data)
     if (info != qemu_clipboard_info(s)) {
         vd->cbpending[s] = 0;
         if (!self_update) {
-            vdagent_send_clipboard_grab(vd, info);
+            if (info->owner) {
+                vdagent_send_clipboard_grab(vd, info);
+            } else {
+                vdagent_send_clipboard_release(vd, info);
+            }
         }
         return;
     }
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 17/18] ui/gtk-clipboard: emit release clipboard events
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (15 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 16/18] ui/vdagent: send release when no clipboard owner marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 13:57 ` [PATCH v3 18/18] ui/vdagent: add a migration blocker marcandre.lureau
  2021-08-27 13:21 ` [PATCH v3 00/18] Clipboard fixes (for 6.1?) Marc-André Lureau
  18 siblings, 0 replies; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/gtk-clipboard.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/ui/gtk-clipboard.c b/ui/gtk-clipboard.c
index 4e4b3c52bb..35b7a2c228 100644
--- a/ui/gtk-clipboard.c
+++ b/ui/gtk-clipboard.c
@@ -163,6 +163,8 @@ static void gd_owner_change(GtkClipboard *clipboard,
         qemu_clipboard_info_unref(info);
         break;
     default:
+        qemu_clipboard_peer_release(&gd->cbpeer, s);
+        gd->cbowner[s] = false;
         break;
     }
 }
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v3 18/18] ui/vdagent: add a migration blocker
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (16 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 17/18] ui/gtk-clipboard: emit release clipboard events marcandre.lureau
@ 2021-08-05 13:57 ` marcandre.lureau
  2021-08-05 14:57   ` Marc-André Lureau
  2021-08-27 13:21 ` [PATCH v3 00/18] Clipboard fixes (for 6.1?) Marc-André Lureau
  18 siblings, 1 reply; 25+ messages in thread
From: marcandre.lureau @ 2021-08-05 13:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The current implementation lacks migration support. After migration,
vdagent support will be broken (even after a restart of the daemons).
Let's try to fix it in 6.2.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index 7d8cb963ff..603a2a7bd2 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -6,6 +6,7 @@
 #include "qemu/option.h"
 #include "qemu/units.h"
 #include "hw/qdev-core.h"
+#include "migration/blocker.h"
 #include "ui/clipboard.h"
 #include "ui/console.h"
 #include "ui/input.h"
@@ -23,6 +24,9 @@
 struct VDAgentChardev {
     Chardev parent;
 
+    /* TODO: migration isn't yet supported */
+    Error *migration_blocker;
+
     /* config */
     bool mouse;
     bool clipboard;
@@ -599,6 +603,10 @@ static void vdagent_chr_open(Chardev *chr,
     return;
 #endif
 
+    if (migrate_add_blocker(vd->migration_blocker, errp) != 0) {
+        return;
+    }
+
     vd->mouse = VDAGENT_MOUSE_DEFAULT;
     if (cfg->has_mouse) {
         vd->mouse = cfg->mouse;
@@ -832,6 +840,8 @@ static void vdagent_chr_init(Object *obj)
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
 
     buffer_init(&vd->outbuf, "vdagent-outbuf");
+    error_setg(&vd->migration_blocker,
+               "The vdagent chardev doesn't yet support migration");
 }
 
 static void vdagent_chr_fini(Object *obj)
@@ -840,6 +850,7 @@ static void vdagent_chr_fini(Object *obj)
 
     vdagent_disconnect(vd);
     buffer_free(&vd->outbuf);
+    error_free(vd->migration_blocker);
 }
 
 static const TypeInfo vdagent_chr_type_info = {
-- 
2.32.0.264.g75ae10bc75



^ permalink raw reply related	[flat|nested] 25+ messages in thread

* Re: [PATCH v3 18/18] ui/vdagent: add a migration blocker
  2021-08-05 13:57 ` [PATCH v3 18/18] ui/vdagent: add a migration blocker marcandre.lureau
@ 2021-08-05 14:57   ` Marc-André Lureau
  0 siblings, 0 replies; 25+ messages in thread
From: Marc-André Lureau @ 2021-08-05 14:57 UTC (permalink / raw)
  To: QEMU; +Cc: Gerd Hoffmann

[-- Attachment #1: Type: text/plain, Size: 2067 bytes --]

On Thu, Aug 5, 2021 at 6:06 PM <marcandre.lureau@redhat.com> wrote:

> From: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> The current implementation lacks migration support. After migration,
> vdagent support will be broken (even after a restart of the daemons).
> Let's try to fix it in 6.2.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  ui/vdagent.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)
>
> diff --git a/ui/vdagent.c b/ui/vdagent.c
> index 7d8cb963ff..603a2a7bd2 100644
> --- a/ui/vdagent.c
> +++ b/ui/vdagent.c
> @@ -6,6 +6,7 @@
>  #include "qemu/option.h"
>  #include "qemu/units.h"
>  #include "hw/qdev-core.h"
> +#include "migration/blocker.h"
>  #include "ui/clipboard.h"
>  #include "ui/console.h"
>  #include "ui/input.h"
> @@ -23,6 +24,9 @@
>  struct VDAgentChardev {
>      Chardev parent;
>
> +    /* TODO: migration isn't yet supported */
> +    Error *migration_blocker;
> +
>      /* config */
>      bool mouse;
>      bool clipboard;
> @@ -599,6 +603,10 @@ static void vdagent_chr_open(Chardev *chr,
>      return;
>  #endif
>
> +    if (migrate_add_blocker(vd->migration_blocker, errp) != 0) {
> +        return;
> +    }
> +
>      vd->mouse = VDAGENT_MOUSE_DEFAULT;
>      if (cfg->has_mouse) {
>          vd->mouse = cfg->mouse;
> @@ -832,6 +840,8 @@ static void vdagent_chr_init(Object *obj)
>      VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
>
>      buffer_init(&vd->outbuf, "vdagent-outbuf");
> +    error_setg(&vd->migration_blocker,
> +               "The vdagent chardev doesn't yet support migration");
>  }
>
>  static void vdagent_chr_fini(Object *obj)
> @@ -840,6 +850,7 @@ static void vdagent_chr_fini(Object *obj)
>
>
Missing
 +    migrate_del_blocker(vd->migration_blocker);

     vdagent_disconnect(vd);
>      buffer_free(&vd->outbuf);
> +    error_free(vd->migration_blocker);
>  }
>
>  static const TypeInfo vdagent_chr_type_info = {
> --
> 2.32.0.264.g75ae10bc75
>
>
>

-- 
Marc-André Lureau

[-- Attachment #2: Type: text/html, Size: 3133 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH v3 00/18] Clipboard fixes (for 6.1?)
  2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
                   ` (17 preceding siblings ...)
  2021-08-05 13:57 ` [PATCH v3 18/18] ui/vdagent: add a migration blocker marcandre.lureau
@ 2021-08-27 13:21 ` Marc-André Lureau
  2021-08-31 12:30   ` Gerd Hoffmann
  18 siblings, 1 reply; 25+ messages in thread
From: Marc-André Lureau @ 2021-08-27 13:21 UTC (permalink / raw)
  To: QEMU, Philippe Mathieu-Daudé; +Cc: Gerd Hoffmann

[-- Attachment #1: Type: text/plain, Size: 2163 bytes --]

Hi

On Thu, Aug 5, 2021 at 5:59 PM <marcandre.lureau@redhat.com> wrote:

> From: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> Hi,
>
> Here is a few fixes I have collected while working on clipboard-related
> code.
>
> There are some obvious code improvements/fixes, and better handling of
> release &
> unregister to avoid dangling pointers and improve user experience.
>
> v3:
>  - add a migration blocker
>  - improve the code by using a few helpers
>
> v2:
>  - replaced "ui/vdagent: unregister clipboard peer on finalize" with
> "ui/vdagent: disconnect handlers and reset state on finalize" patch.
>  - added "ui/vdagent: reset outbuf on disconnect"
>  - commit message tweaks
>
> Marc-André Lureau (18):
>   ui/vdagent: fix leak on error path
>   ui/vdagent: remove copy-pasta comment
>   ui/gtk-clipboard: use existing macros
>   ui/gtk-clipboard: fix clipboard enum typo
>   ui/clipboard: add helper to retrieve current clipboard
>   ui/clipboard: add qemu_clipboard_peer_owns() helper
>   ui/clipboard: add qemu_clipboard_peer_release() helper
>   ui/clipboard: release owned grabs on unregister
>   ui/vdagent: disconnect handlers and reset state on finalize
>   ui/vdagent: reset outbuf on disconnect
>   ui/vdagent: split clipboard recv message handling
>   ui/vdagent: use qemu_clipboard_peer_release helper
>   ui/vdagent: use qemu_clipboard_info helper
>   ui/vdagent: send empty clipboard when unhandled
>   ui/gtk-clipboard: use qemu_clipboard_info helper
>   ui/vdagent: send release when no clipboard owner
>   ui/gtk-clipboard: emit release clipboard events
>   ui/vdagent: add a migration blocker
>
>  include/ui/clipboard.h |  33 ++++++
>  include/ui/gtk.h       |   1 -
>  ui/clipboard.c         |  41 +++++++
>  ui/gtk-clipboard.c     |  24 ++---
>  ui/vdagent.c           | 239 ++++++++++++++++++++++++++---------------
>  ui/trace-events        |   1 +
>  6 files changed, 240 insertions(+), 99 deletions(-)
>
> --
> 2.32.0.264.g75ae10bc75
>
>
>
>

Ping

Since Gerd is lowering his maintainer responsibilities, is anyone else
interested?

-- 
Marc-André Lureau

[-- Attachment #2: Type: text/html, Size: 2850 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH v3 01/18] ui/vdagent: fix leak on error path
  2021-08-05 13:56 ` [PATCH v3 01/18] ui/vdagent: fix leak on error path marcandre.lureau
@ 2021-08-27 13:29   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-08-27 13:29 UTC (permalink / raw)
  To: marcandre.lureau, qemu-devel; +Cc: Gerd Hoffmann

On 8/5/21 3:56 PM, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> "info" was leaked when more than 10 entries.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/ui/clipboard.h | 2 ++
>  ui/vdagent.c           | 4 +---
>  2 files changed, 3 insertions(+), 3 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH v3 09/18] ui/vdagent: disconnect handlers and reset state on finalize
  2021-08-05 13:57 ` [PATCH v3 09/18] ui/vdagent: disconnect handlers and reset state on finalize marcandre.lureau
@ 2021-08-27 13:33   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 25+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-08-27 13:33 UTC (permalink / raw)
  To: marcandre.lureau, qemu-devel; +Cc: Gerd Hoffmann

On 8/5/21 3:57 PM, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Avoid handlers being called with dangling pointers when the object is
> freed.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  ui/vdagent.c | 25 +++++++++++++++----------
>  1 file changed, 15 insertions(+), 10 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH v3 00/18] Clipboard fixes (for 6.1?)
  2021-08-27 13:21 ` [PATCH v3 00/18] Clipboard fixes (for 6.1?) Marc-André Lureau
@ 2021-08-31 12:30   ` Gerd Hoffmann
  2021-08-31 12:34     ` Marc-André Lureau
  0 siblings, 1 reply; 25+ messages in thread
From: Gerd Hoffmann @ 2021-08-31 12:30 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: QEMU, Philippe Mathieu-Daudé

  Hi,

> > Marc-André Lureau (18):
> >   ui/vdagent: fix leak on error path
> >   ui/vdagent: remove copy-pasta comment
> >   ui/gtk-clipboard: use existing macros
> >   ui/gtk-clipboard: fix clipboard enum typo
> >   ui/clipboard: add helper to retrieve current clipboard
> >   ui/clipboard: add qemu_clipboard_peer_owns() helper
> >   ui/clipboard: add qemu_clipboard_peer_release() helper
> >   ui/clipboard: release owned grabs on unregister
> >   ui/vdagent: disconnect handlers and reset state on finalize
> >   ui/vdagent: reset outbuf on disconnect
> >   ui/vdagent: split clipboard recv message handling
> >   ui/vdagent: use qemu_clipboard_peer_release helper
> >   ui/vdagent: use qemu_clipboard_info helper
> >   ui/vdagent: send empty clipboard when unhandled
> >   ui/gtk-clipboard: use qemu_clipboard_info helper
> >   ui/vdagent: send release when no clipboard owner
> >   ui/gtk-clipboard: emit release clipboard events
> >   ui/vdagent: add a migration blocker

Looks all sane to me.

Acked-by: Gerd Hoffmann <kraxel@redhat.com>

> Ping
> 
> Since Gerd is lowering his maintainer responsibilities, is anyone else
> interested?

Don't be shy, send a pull request?

take care,
  Gerd



^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH v3 00/18] Clipboard fixes (for 6.1?)
  2021-08-31 12:30   ` Gerd Hoffmann
@ 2021-08-31 12:34     ` Marc-André Lureau
  0 siblings, 0 replies; 25+ messages in thread
From: Marc-André Lureau @ 2021-08-31 12:34 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: QEMU, Philippe Mathieu-Daudé

[-- Attachment #1: Type: text/plain, Size: 1404 bytes --]

Hi

On Tue, Aug 31, 2021 at 4:30 PM Gerd Hoffmann <kraxel@redhat.com> wrote:

>   Hi,
>
> > > Marc-André Lureau (18):
> > >   ui/vdagent: fix leak on error path
> > >   ui/vdagent: remove copy-pasta comment
> > >   ui/gtk-clipboard: use existing macros
> > >   ui/gtk-clipboard: fix clipboard enum typo
> > >   ui/clipboard: add helper to retrieve current clipboard
> > >   ui/clipboard: add qemu_clipboard_peer_owns() helper
> > >   ui/clipboard: add qemu_clipboard_peer_release() helper
> > >   ui/clipboard: release owned grabs on unregister
> > >   ui/vdagent: disconnect handlers and reset state on finalize
> > >   ui/vdagent: reset outbuf on disconnect
> > >   ui/vdagent: split clipboard recv message handling
> > >   ui/vdagent: use qemu_clipboard_peer_release helper
> > >   ui/vdagent: use qemu_clipboard_info helper
> > >   ui/vdagent: send empty clipboard when unhandled
> > >   ui/gtk-clipboard: use qemu_clipboard_info helper
> > >   ui/vdagent: send release when no clipboard owner
> > >   ui/gtk-clipboard: emit release clipboard events
> > >   ui/vdagent: add a migration blocker
>
> Looks all sane to me.
>
> Acked-by: Gerd Hoffmann <kraxel@redhat.com>
>
>
thanks

> Ping
> >
> > Since Gerd is lowering his maintainer responsibilities, is anyone else
> > interested?
>
> Don't be shy, send a pull request?
>

Ok!


-- 
Marc-André Lureau

[-- Attachment #2: Type: text/html, Size: 2258 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2021-08-31 13:12 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-05 13:56 [PATCH v3 00/18] Clipboard fixes (for 6.1?) marcandre.lureau
2021-08-05 13:56 ` [PATCH v3 01/18] ui/vdagent: fix leak on error path marcandre.lureau
2021-08-27 13:29   ` Philippe Mathieu-Daudé
2021-08-05 13:56 ` [PATCH v3 02/18] ui/vdagent: remove copy-pasta comment marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 03/18] ui/gtk-clipboard: use existing macros marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 04/18] ui/gtk-clipboard: fix clipboard enum typo marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 05/18] ui/clipboard: add helper to retrieve current clipboard marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 06/18] ui/clipboard: add qemu_clipboard_peer_owns() helper marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 07/18] ui/clipboard: add qemu_clipboard_peer_release() helper marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 08/18] ui/clipboard: release owned grabs on unregister marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 09/18] ui/vdagent: disconnect handlers and reset state on finalize marcandre.lureau
2021-08-27 13:33   ` Philippe Mathieu-Daudé
2021-08-05 13:57 ` [PATCH v3 10/18] ui/vdagent: reset outbuf on disconnect marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 11/18] ui/vdagent: split clipboard recv message handling marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 12/18] ui/vdagent: use qemu_clipboard_peer_release helper marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 13/18] ui/vdagent: use qemu_clipboard_info helper marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 14/18] ui/vdagent: send empty clipboard when unhandled marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 15/18] ui/gtk-clipboard: use qemu_clipboard_info helper marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 16/18] ui/vdagent: send release when no clipboard owner marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 17/18] ui/gtk-clipboard: emit release clipboard events marcandre.lureau
2021-08-05 13:57 ` [PATCH v3 18/18] ui/vdagent: add a migration blocker marcandre.lureau
2021-08-05 14:57   ` Marc-André Lureau
2021-08-27 13:21 ` [PATCH v3 00/18] Clipboard fixes (for 6.1?) Marc-André Lureau
2021-08-31 12:30   ` Gerd Hoffmann
2021-08-31 12:34     ` Marc-André Lureau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.