On 06/09/2014 02:20 PM, Marc-André Lureau wrote: > > > ----- Original Message ----- >> On 06/04/2014 07:45 PM, Marc-André Lureau wrote: >>> From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> >>> >>> When both the client and the agent advertize >>> VD_AGENT_CAP_ANY_SELECTION_TYPE capability, the existing >>> VDAgentClipboard messages are modified to embed string >>> representation of the selection mime type. >>> >>> Handling arbitrary mime types allows to describe any selection data >>> type, instead of a limited fixed list. The approach to reuse the integer >>> representation to extend the type with a registry (like X's atoms) has >>> been discarded (too complicated without substential benefits) >>> >>> A string is a \0 terminated utf8 byte array: foo\0 >>> A string[] is a \0\0 terminated array of utf8 strings: foo\0bar\0\0. >> >> So no null strings in the list? sounds fine to me (just need to verify >> this in code). > > Yes, empty string are invalid here (of course, shouldn't crash anyway) > >> And the client will need to handle window system specific changes? or >> can it pass the mime types on without looking at them? > > As long as the content is a MIME description-like, it can pass it. > > (some application or window system may use invalid MIME, but I consider this > is not Spice to take care of, applications are flexible, they take what they > handle best) And such behaviour will just be 'bug compatible' under spice - ACK by me. > >> >>> --- >>> spice/vd_agent.h | 33 +++++++++++++++++++++++---------- >>> 1 file changed, 23 insertions(+), 10 deletions(-) >>> >>> diff --git a/spice/vd_agent.h b/spice/vd_agent.h >>> index 7464661..2e24c87 100644 >>> --- a/spice/vd_agent.h >>> +++ b/spice/vd_agent.h >>> @@ -161,15 +161,6 @@ enum { >>> VD_AGENT_ERROR, >>> }; >>> >>> -typedef struct SPICE_ATTR_PACKED VDAgentClipboard { >>> -#if 0 /* VD_AGENT_CAP_CLIPBOARD_SELECTION */ >>> - uint8_t selection; >>> - uint8_t __reserved[sizeof(uint32_t) - 1 * sizeof(uint8_t)]; >>> -#endif >>> - uint32_t type; >>> - uint8_t data[0]; >>> -} VDAgentClipboard; >>> - >>> enum { >>> VD_AGENT_CLIPBOARD_NONE = 0, >>> VD_AGENT_CLIPBOARD_UTF8_TEXT, >>> @@ -179,12 +170,29 @@ enum { >>> VD_AGENT_CLIPBOARD_IMAGE_JPG, /* optional */ >>> }; >>> >>> +typedef struct SPICE_ATTR_PACKED VDAgentClipboard { >>> +#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_ANY_SELECTION_TYPE */ >>> + string type; >>> +#else >>> + uint32_t type; >>> +#endif >>> + uint8_t data[0]; >>> +} VDAgentClipboard; >>> + >>> 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_ANY_SELECTION_TYPE */ >>> + string[] types; >>> +#else >>> uint32_t types[0]; >>> +#endif >>> } VDAgentClipboardGrab; >>> >>> typedef struct SPICE_ATTR_PACKED VDAgentClipboardRequest { >>> @@ -192,7 +200,11 @@ typedef struct SPICE_ATTR_PACKED >>> VDAgentClipboardRequest { >>> uint8_t selection; >>> uint8_t __reserved[sizeof(uint32_t) - 1 * sizeof(uint8_t)]; >>> #endif >>> - uint32_t type; >>> +#if 0 /* VD_AGENT_CAP_ANY_SELECTION_TYPE */ >>> + string type; >>> +#else >>> + uint32_t type; /* string type; */ >>> +#endif >>> } VDAgentClipboardRequest; >>> >>> typedef struct SPICE_ATTR_PACKED VDAgentClipboardRelease { >>> @@ -218,6 +230,7 @@ enum { >>> VD_AGENT_CAP_GUEST_LINEEND_LF, >>> VD_AGENT_CAP_GUEST_LINEEND_CRLF, >>> VD_AGENT_CAP_MAX_CLIPBOARD, >>> + VD_AGENT_CAP_ANY_SELECTION_TYPE, >>> VD_AGENT_END_CAP, >>> }; >>> >>> >> >> _______________________________________________ >> Spice-devel mailing list >> Spice-devel@xxxxxxxxxxxxxxxxxxxxx >> http://lists.freedesktop.org/mailman/listinfo/spice-devel >> _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel