diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2021-08-05 17:57:13 +0400 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2021-08-31 17:25:14 +0400 |
commit | 314bf50086d8b7d057f980cb1cd6ed5c87640980 (patch) | |
tree | 0bbd539e7bd4bf0e9769213c551050602d2e9939 /ui/vdagent.c | |
parent | b702c863bfaf590e00e3cc9d599f3bbdd955d099 (diff) |
ui/vdagent: send release when no clipboard owner
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>
Diffstat (limited to 'ui/vdagent.c')
-rw-r--r-- | ui/vdagent.c | 24 |
1 files changed, 23 insertions, 1 deletions
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; } |