summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2019-03-21 17:18:52 +0100
committerVictor Toso <me@victortoso.com>2020-03-06 09:24:31 +0100
commit045a6978d6dbbf7046affc5c321fa8177c8cce56 (patch)
treed2de4dab93200d72e38bd2567d90443e39b9c856
parent4f397d695dc4bfef0334d617d2f7aa7866d07cef (diff)
vdagent: introduce VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL
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> Acked-by: Victor Toso <victortoso@redhat.com>
-rw-r--r--spice/vd_agent.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/spice/vd_agent.h b/spice/vd_agent.h
index dd947af..51889fc 100644
--- a/spice/vd_agent.h
+++ b/spice/vd_agent.h
@@ -232,6 +232,9 @@ typedef struct SPICE_ATTR_PACKED VDAgentClipboardGrab {
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;
@@ -304,6 +307,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,
};