All of lore.kernel.org
 help / color / mirror / Atom feed
* [PULL 00/18] UI/clipboard fixes
@ 2021-08-31 13:31 marcandre.lureau
  2021-08-31 13:31 ` [PULL 01/18] ui/vdagent: fix leak on error path marcandre.lureau
                   ` (18 more replies)
  0 siblings, 19 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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

The following changes since commit ad22d0583300df420819e6c89b1c022b998fac8a:

  Merge remote-tracking branch 'remotes/dg-gitlab/tags/ppc-for-6.2-20210827' into staging (2021-08-27 11:34:12 +0100)

are available in the Git repository at:

  git@gitlab.com:marcandre.lureau/qemu.git tags/clip-pull-request

for you to fetch changes up to 90208bc9657b7e0f8a6bc6af82b69c65c97b2d64:

  ui/vdagent: add a migration blocker (2021-08-31 17:25:14 +0400)

----------------------------------------------------------------

----------------------------------------------------------------

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           | 240 ++++++++++++++++++++++++++---------------
 ui/trace-events        |   1 +
 6 files changed, 241 insertions(+), 99 deletions(-)

-- 
2.33.0.rc2




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

* [PULL 01/18] ui/vdagent: fix leak on error path
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 02/18] ui/vdagent: remove copy-pasta comment marcandre.lureau
                   ` (17 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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>
Message-Id: <20210805135715.857938-2-marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 02/18] ui/vdagent: remove copy-pasta comment
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
  2021-08-31 13:31 ` [PULL 01/18] ui/vdagent: fix leak on error path marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 03/18] ui/gtk-clipboard: use existing macros marcandre.lureau
                   ` (16 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-3-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

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

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>
Message-Id: <20210805135715.857938-4-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

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

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-5-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

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

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-6-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 06/18] ui/clipboard: add qemu_clipboard_peer_owns() helper
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (4 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 05/18] ui/clipboard: add helper to retrieve current clipboard marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 07/18] ui/clipboard: add qemu_clipboard_peer_release() helper marcandre.lureau
                   ` (12 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-7-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 07/18] ui/clipboard: add qemu_clipboard_peer_release() helper
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (5 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 06/18] ui/clipboard: add qemu_clipboard_peer_owns() helper marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 08/18] ui/clipboard: release owned grabs on unregister marcandre.lureau
                   ` (11 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-8-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

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

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-9-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 09/18] ui/vdagent: disconnect handlers and reset state on finalize
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (7 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 08/18] ui/clipboard: release owned grabs on unregister marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 10/18] ui/vdagent: reset outbuf on disconnect marcandre.lureau
                   ` (9 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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>
Message-Id: <20210805135715.857938-10-marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 10/18] ui/vdagent: reset outbuf on disconnect
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (8 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 09/18] ui/vdagent: disconnect handlers and reset state on finalize marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 11/18] ui/vdagent: split clipboard recv message handling marcandre.lureau
                   ` (8 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-11-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 11/18] ui/vdagent: split clipboard recv message handling
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (9 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 10/18] ui/vdagent: reset outbuf on disconnect marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 12/18] ui/vdagent: use qemu_clipboard_peer_release helper marcandre.lureau
                   ` (7 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-12-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 12/18] ui/vdagent: use qemu_clipboard_peer_release helper
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (10 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 11/18] ui/vdagent: split clipboard recv message handling marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 13/18] ui/vdagent: use qemu_clipboard_info helper marcandre.lureau
                   ` (6 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-13-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 13/18] ui/vdagent: use qemu_clipboard_info helper
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (11 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 12/18] ui/vdagent: use qemu_clipboard_peer_release helper marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 14/18] ui/vdagent: send empty clipboard when unhandled marcandre.lureau
                   ` (5 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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>
Message-Id: <20210805135715.857938-14-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 14/18] ui/vdagent: send empty clipboard when unhandled
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (12 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 13/18] ui/vdagent: use qemu_clipboard_info helper marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 15/18] ui/gtk-clipboard: use qemu_clipboard_info helper marcandre.lureau
                   ` (4 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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>
Message-Id: <20210805135715.857938-15-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 15/18] ui/gtk-clipboard: use qemu_clipboard_info helper
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (13 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 14/18] ui/vdagent: send empty clipboard when unhandled marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 16/18] ui/vdagent: send release when no clipboard owner marcandre.lureau
                   ` (3 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-16-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 16/18] ui/vdagent: send release when no clipboard owner
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (14 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 15/18] ui/gtk-clipboard: use qemu_clipboard_info helper marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 17/18] ui/gtk-clipboard: emit release clipboard events marcandre.lureau
                   ` (2 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-17-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 17/18] ui/gtk-clipboard: emit release clipboard events
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (15 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 16/18] ui/vdagent: send release when no clipboard owner marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 13:31 ` [PULL 18/18] ui/vdagent: add a migration blocker marcandre.lureau
  2021-08-31 19:49 ` [PULL 00/18] UI/clipboard fixes Peter Maydell
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210805135715.857938-18-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@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.33.0.rc2



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

* [PULL 18/18] ui/vdagent: add a migration blocker
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (16 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 17/18] ui/gtk-clipboard: emit release clipboard events marcandre.lureau
@ 2021-08-31 13:31 ` marcandre.lureau
  2021-08-31 19:49 ` [PULL 00/18] UI/clipboard fixes Peter Maydell
  18 siblings, 0 replies; 20+ messages in thread
From: marcandre.lureau @ 2021-08-31 13:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gerd Hoffmann, Marc-André Lureau

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>
Message-Id: <20210805135715.857938-19-marcandre.lureau@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/vdagent.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index 7d8cb963ff..19e8fbfc96 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,14 +840,18 @@ 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)
 {
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
 
+    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.33.0.rc2



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

* Re: [PULL 00/18] UI/clipboard fixes
  2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
                   ` (17 preceding siblings ...)
  2021-08-31 13:31 ` [PULL 18/18] ui/vdagent: add a migration blocker marcandre.lureau
@ 2021-08-31 19:49 ` Peter Maydell
  18 siblings, 0 replies; 20+ messages in thread
From: Peter Maydell @ 2021-08-31 19:49 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: QEMU Developers, Gerd Hoffmann

On Tue, 31 Aug 2021 at 14:31, <marcandre.lureau@redhat.com> wrote:
>
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> The following changes since commit ad22d0583300df420819e6c89b1c022b998fac8a:
>
>   Merge remote-tracking branch 'remotes/dg-gitlab/tags/ppc-for-6.2-20210827' into staging (2021-08-27 11:34:12 +0100)
>
> are available in the Git repository at:
>
>   git@gitlab.com:marcandre.lureau/qemu.git tags/clip-pull-request
>
> for you to fetch changes up to 90208bc9657b7e0f8a6bc6af82b69c65c97b2d64:
>
>   ui/vdagent: add a migration blocker (2021-08-31 17:25:14 +0400)
>


Applied, thanks.

Please update the changelog at https://wiki.qemu.org/ChangeLog/6.2
for any user-visible changes.

-- PMM


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

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

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-31 13:31 [PULL 00/18] UI/clipboard fixes marcandre.lureau
2021-08-31 13:31 ` [PULL 01/18] ui/vdagent: fix leak on error path marcandre.lureau
2021-08-31 13:31 ` [PULL 02/18] ui/vdagent: remove copy-pasta comment marcandre.lureau
2021-08-31 13:31 ` [PULL 03/18] ui/gtk-clipboard: use existing macros marcandre.lureau
2021-08-31 13:31 ` [PULL 04/18] ui/gtk-clipboard: fix clipboard enum typo marcandre.lureau
2021-08-31 13:31 ` [PULL 05/18] ui/clipboard: add helper to retrieve current clipboard marcandre.lureau
2021-08-31 13:31 ` [PULL 06/18] ui/clipboard: add qemu_clipboard_peer_owns() helper marcandre.lureau
2021-08-31 13:31 ` [PULL 07/18] ui/clipboard: add qemu_clipboard_peer_release() helper marcandre.lureau
2021-08-31 13:31 ` [PULL 08/18] ui/clipboard: release owned grabs on unregister marcandre.lureau
2021-08-31 13:31 ` [PULL 09/18] ui/vdagent: disconnect handlers and reset state on finalize marcandre.lureau
2021-08-31 13:31 ` [PULL 10/18] ui/vdagent: reset outbuf on disconnect marcandre.lureau
2021-08-31 13:31 ` [PULL 11/18] ui/vdagent: split clipboard recv message handling marcandre.lureau
2021-08-31 13:31 ` [PULL 12/18] ui/vdagent: use qemu_clipboard_peer_release helper marcandre.lureau
2021-08-31 13:31 ` [PULL 13/18] ui/vdagent: use qemu_clipboard_info helper marcandre.lureau
2021-08-31 13:31 ` [PULL 14/18] ui/vdagent: send empty clipboard when unhandled marcandre.lureau
2021-08-31 13:31 ` [PULL 15/18] ui/gtk-clipboard: use qemu_clipboard_info helper marcandre.lureau
2021-08-31 13:31 ` [PULL 16/18] ui/vdagent: send release when no clipboard owner marcandre.lureau
2021-08-31 13:31 ` [PULL 17/18] ui/gtk-clipboard: emit release clipboard events marcandre.lureau
2021-08-31 13:31 ` [PULL 18/18] ui/vdagent: add a migration blocker marcandre.lureau
2021-08-31 19:49 ` [PULL 00/18] UI/clipboard fixes Peter Maydell

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.