69 lines
2.4 KiB
Diff
69 lines
2.4 KiB
Diff
From e8a2b9ec5a0ed46a06c9e28a0099b2a2516f710e Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com>
|
|
Date: Fri, 22 Mar 2019 14:56:48 +0100
|
|
Subject: [PATCH 3/3] vdagent: introduce VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
When this capability is negoticated by both the client & the agent,
|
|
the clipboard grab messages have an associated serial counter.
|
|
|
|
The serial is reset to 0 upon client connection.
|
|
|
|
The counter is increment by 1 on each grab message, by both sides.
|
|
|
|
The sender of the message with the highest serial should be the
|
|
clipboard grab owner, and the current session serial should be
|
|
updated.
|
|
|
|
If a lower serial than the current session serial is received, the
|
|
grab should be discarded.
|
|
|
|
Whenever two grabs share the same serial, the one coming from the
|
|
client should have a higher priority and the client should gain the
|
|
clipboard ownership.
|
|
|
|
No special treatement is done for the unlikely case of overflowing the
|
|
counter. It may temporarily inverse the priority, until both side have
|
|
overflown and/or synchronized.
|
|
|
|
Note: this mechanism isn't aiming at making "the most recent" (as in
|
|
time) side gaining the ownership. One side sending subsequent grab
|
|
messages earlier will likely take the ownership over a side sending a
|
|
single message simultaneously the other way. It only clears the
|
|
situation where both side believe that the other is the current
|
|
clipboard owner, by having a global ordering and priority in case of
|
|
serial conflict.
|
|
|
|
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
|
---
|
|
spice/vd_agent.h | 4 ++++
|
|
1 file changed, 4 insertions(+)
|
|
|
|
diff --git a/spice/vd_agent.h b/spice/vd_agent.h
|
|
index ad61339..07673d7 100644
|
|
--- a/spice/vd_agent.h
|
|
+++ b/spice/vd_agent.h
|
|
@@ -237,6 +237,9 @@ typedef struct SPICE_ATTR_PACKED VDAgentClipboardGrab {
|
|
#if 0 /* VD_AGENT_CAP_CLIPBOARD_SELECTION */
|
|
uint8_t selection;
|
|
uint8_t __reserved[sizeof(uint32_t) - 1 * sizeof(uint8_t)];
|
|
+#endif
|
|
+#if 0 /* VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL */
|
|
+ uint32_t serial;
|
|
#endif
|
|
uint32_t types[0];
|
|
} VDAgentClipboardGrab;
|
|
@@ -310,6 +313,7 @@ enum {
|
|
VD_AGENT_CAP_FILE_XFER_DETAILED_ERRORS,
|
|
VD_AGENT_CAP_GRAPHICS_DEVICE_INFO,
|
|
VD_AGENT_CAP_CLIPBOARD_NO_RELEASE_ON_REGRAB,
|
|
+ VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL,
|
|
VD_AGENT_END_CAP,
|
|
};
|
|
|
|
--
|
|
2.23.0
|
|
|