[Spice-devel] [PATCH] vdagent: handle multiple types on clipboard grab send & receive

Hans de Goede hdegoede at redhat.com
Tue Oct 12 01:50:45 PDT 2010


Ack.

On 10/11/2010 03:11 PM, Arnon Gilboa wrote:
> ---
>   vdagent/vdagent.cpp |   70 +++++++++++++++++++++++++++++---------------------
>   1 files changed, 41 insertions(+), 29 deletions(-)
>
> diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp
> index 6c5f73a..c210016 100644
> --- a/vdagent/vdagent.cpp
> +++ b/vdagent/vdagent.cpp
> @@ -31,10 +31,12 @@ typedef struct VDClipboardFormat {
>       uint32_t type;
>   } VDClipboardFormat;
>
> -VDClipboardFormat supported_clipboard_formats[] = {
> +VDClipboardFormat clipboard_formats[] = {
>       {CF_UNICODETEXT, VD_AGENT_CLIPBOARD_UTF8_TEXT},
>       {0, 0}};
>
> +#define clipboard_formats_count (sizeof(clipboard_formats) / sizeof(clipboard_formats[0]))
> +
>   class VDAgent {
>   public:
>       static VDAgent* get();
> @@ -49,7 +51,7 @@ private:
>                                         uint32_t msg_size);
>       bool handle_mon_config(VDAgentMonitorsConfig* mon_config, uint32_t port);
>       bool handle_clipboard(VDAgentClipboard* clipboard, uint32_t size);
> -    bool handle_clipboard_grab(VDAgentClipboardGrab* clipboard_grab);
> +    bool handle_clipboard_grab(VDAgentClipboardGrab* clipboard_grab, uint32_t size);
>       bool handle_clipboard_request(VDAgentClipboardRequest* clipboard_request);
>       void handle_clipboard_release();
>       bool handle_display_config(VDAgentDisplayConfig* display_config, uint32_t port);
> @@ -794,27 +796,27 @@ bool VDAgent::write_message(uint32_t type, uint32_t size = 0, void* data = NULL)
>       return true;
>   }
>
> -//FIXME: send grab for all available types rather than just the first one
>   void VDAgent::on_clipboard_grab()
>   {
> -    uint32_t type = 0;
> +    uint32_t* types = new uint32_t[clipboard_formats_count];
> +    int count = 0;
>
> -    for (VDClipboardFormat* iter = supported_clipboard_formats; iter->format&&  !type; iter++) {
> -        if (IsClipboardFormatAvailable(iter->format)) {
> -            type = iter->type;
> -        }
> -    }
> -    if (!type) {
> -        vd_printf("Unsupported clipboard format");
> -        return;
> -    }
>       if (!VD_AGENT_HAS_CAPABILITY(_client_caps, _client_caps_size,
>                                    VD_AGENT_CAP_CLIPBOARD_BY_DEMAND)) {
>           return;
>       }
> -    uint32_t grab_types[] = {type};
> -    write_message(VD_AGENT_CLIPBOARD_GRAB, sizeof(grab_types),&grab_types);
> -    set_clipboard_owner(owner_guest);
> +    for (VDClipboardFormat* iter = clipboard_formats; iter->format; iter++) {
> +        if (IsClipboardFormatAvailable(iter->format)) {
> +            types[count++] = iter->type;
> +        }
> +    }
> +    if (count) {
> +        write_message(VD_AGENT_CLIPBOARD_GRAB, count * sizeof(types[0]), types);
> +        set_clipboard_owner(owner_guest);
> +    } else {
> +        vd_printf("Unsupported clipboard format");
> +    }
> +    delete[] types;
>   }
>
>   // In delayed rendering, Windows requires us to SetClipboardData before we return from
> @@ -861,20 +863,30 @@ void VDAgent::on_clipboard_release()
>       }
>   }
>
> -bool VDAgent::handle_clipboard_grab(VDAgentClipboardGrab* clipboard_grab)
> +bool VDAgent::handle_clipboard_grab(VDAgentClipboardGrab* clipboard_grab, uint32_t size)
>   {
> -    //FIXME: use all types rather than just the first one
> -    uint32_t format = get_clipboard_format(clipboard_grab->types[0]);
> +    bool has_supported_type = false;
> +    uint32_t format;
>
> -    if (!format) {
> -        vd_printf("Unsupported clipboard type %u", clipboard_grab->types[0]);
> -        return true;
> +    for (uint32_t i = 0; i<  size / sizeof(clipboard_grab->types[0]); i++) {
> +        format = get_clipboard_format(clipboard_grab->types[i]);
> +        //On first supported type, open and empty the clipboard
> +        if (format&&  !has_supported_type) {
> +            has_supported_type = true;
> +            if (!OpenClipboard(_hwnd)) {
> +                return false;
> +            }
> +            EmptyClipboard();
> +        }
> +        //For all supported type set delayed rendering
> +        if (format) {
> +            SetClipboardData(format, NULL);
> +        }
>       }
> -    if (!OpenClipboard(_hwnd)) {
> -        return false;
> +    if (!has_supported_type) {
> +        vd_printf("No supported clipboard types in client grab");
> +        return true;
>       }
> -    EmptyClipboard();
> -    SetClipboardData(format, NULL);
>       CloseClipboard();
>       set_clipboard_owner(owner_client);
>       return true;
> @@ -956,7 +968,7 @@ void VDAgent::handle_clipboard_release()
>
>   uint32_t VDAgent::get_clipboard_format(uint32_t type)
>   {
> -    for (VDClipboardFormat* iter = supported_clipboard_formats; iter->format&&  iter->type; iter++) {
> +    for (VDClipboardFormat* iter = clipboard_formats; iter->format&&  iter->type; iter++) {
>           if (iter->type == type) {
>               return iter->format;
>           }
> @@ -966,7 +978,7 @@ uint32_t VDAgent::get_clipboard_format(uint32_t type)
>
>   uint32_t VDAgent::get_clipboard_type(uint32_t format)
>   {
> -    for (VDClipboardFormat* iter = supported_clipboard_formats; iter->format&&  iter->type; iter++) {
> +    for (VDClipboardFormat* iter = clipboard_formats; iter->format&&  iter->type; iter++) {
>           if (iter->format == format) {
>               return iter->type;
>           }
> @@ -1027,7 +1039,7 @@ void VDAgent::dispatch_message(VDAgentMessage* msg, uint32_t port)
>           a->handle_clipboard((VDAgentClipboard*)msg->data, msg->size - sizeof(VDAgentClipboard));
>           break;
>       case VD_AGENT_CLIPBOARD_GRAB:
> -        a->handle_clipboard_grab((VDAgentClipboardGrab*)msg->data);
> +        a->handle_clipboard_grab((VDAgentClipboardGrab*)msg->data, msg->size);
>           break;
>       case VD_AGENT_CLIPBOARD_REQUEST:
>           res = a->handle_clipboard_request((VDAgentClipboardRequest*)msg->data);


More information about the Spice-devel mailing list