[Spice-devel] [PATCH spice 05/17] Change VD_AGENT_CLIPBOARD_GRAB to an array of types

Arnon Gilboa agilboa at redhat.com
Mon Oct 4 07:09:42 PDT 2010


Hans de Goede wrote:
> A clipboard owner can indicate that it can supply the data the clipboard
> owns in multiple formats, so make the data passed with a
> VD_AGENT_CLIPBOARD_GRAB message an array of types rather then a single
> type.
> ---
>  client/platform.h           |    4 ++--
>  client/red_client.cpp       |   10 +++++-----
>  client/red_client.h         |   17 ++++++++++++++---
>  client/windows/platform.cpp |   11 ++++++-----
>  client/x11/platform.cpp     |   12 +++++++-----
>  5 files changed, 34 insertions(+), 20 deletions(-)
>
> diff --git a/client/platform.h b/client/platform.h
> index 4727889..48476cf 100644
> --- a/client/platform.h
> +++ b/client/platform.h
> @@ -121,7 +121,7 @@ public:
>      class ClipboardListener;
>      static void set_clipboard_listener(ClipboardListener* listener);
>  
> -    static bool set_clipboard_owner(uint32_t type);
> +    static bool set_clipboard_owner(uint32_t *types, uint32_t type_count);
>      static bool set_clipboard_data(uint32_t type, const uint8_t* data, int32_t size);
>      static bool request_clipboard_notification(uint32_t type);
>      static void release_clipboard();
> @@ -138,7 +138,7 @@ public:
>  class Platform::ClipboardListener {
>  public:
>      virtual ~ClipboardListener() {}
> -    virtual void on_clipboard_grab(uint32_t type) = 0;
> +    virtual void on_clipboard_grab(uint32_t *types, uint32_t type_count) = 0;
>      virtual void on_clipboard_request(uint32_t type) = 0;
>      virtual void on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size) = 0;
>  };
> diff --git a/client/red_client.cpp b/client/red_client.cpp
> index 562b826..e351900 100644
> --- a/client/red_client.cpp
> +++ b/client/red_client.cpp
> @@ -83,9 +83,8 @@ uint32_t default_agent_caps[] = {
>  
>  void ClipboardGrabEvent::response(AbstractProcessLoop& events_loop)
>  {
> -    VDAgentClipboardGrab grab = {_type};
>      static_cast<RedClient*>(events_loop.get_owner())->send_agent_clipboard_message(
> -        VD_AGENT_CLIPBOARD_GRAB, sizeof(grab), &grab);
> +        VD_AGENT_CLIPBOARD_GRAB, _type_count * sizeof(uint32_t), _types);
>  }
>  
>  void ClipboardRequestEvent::response(AbstractProcessLoop& events_loop)
> @@ -834,13 +833,13 @@ void RedClient::send_agent_clipboard_message(uint32_t message_type, uint32_t siz
>      post_message(message);
>  }
>  
> -void RedClient::on_clipboard_grab(uint32_t type)
> +void RedClient::on_clipboard_grab(uint32_t *types, uint32_t type_count)
>  {
>      if (!_agent_caps || !VD_AGENT_HAS_CAPABILITY(_agent_caps, _agent_caps_size,
>                                                   VD_AGENT_CAP_CLIPBOARD_BY_DEMAND)) {
>          return;
>      }
> -    AutoRef<ClipboardGrabEvent> event(new ClipboardGrabEvent(type));
> +    AutoRef<ClipboardGrabEvent> event(new ClipboardGrabEvent(types, type_count));
>      get_process_loop().push_event(*event);
>  }
>  
> @@ -1091,7 +1090,8 @@ void RedClient::dispatch_agent_message(VDAgentMessage* msg, void* data)
>          break;
>      }
>      case VD_AGENT_CLIPBOARD_GRAB:
> -        Platform::set_clipboard_owner(((VDAgentClipboardGrab*)data)->type);
> +        Platform::set_clipboard_owner((uint32_t *)data,
> +                                      msg->size / sizeof(uint32_t));
>          break;
>      case VD_AGENT_CLIPBOARD_REQUEST:
>          if (!Platform::request_clipboard_notification(((VDAgentClipboardRequest*)data)->type)) {
> diff --git a/client/red_client.h b/client/red_client.h
> index 3ccb8e3..2cfce49 100644
> --- a/client/red_client.h
> +++ b/client/red_client.h
> @@ -146,11 +146,22 @@ public:
>  
>  class ClipboardGrabEvent : public Event {
>  public:
> -    ClipboardGrabEvent(uint32_t type) : _type (type) {}
> +    ClipboardGrabEvent(uint32_t *types, uint32_t type_count)
> +    {
> +        _types = new uint32_t [type_count];
> +        memcpy(_types, types, type_count * sizeof(uint32_t));
> +        _type_count = type_count;
> +    }
> +    ~ClipboardGrabEvent()
> +    {
> +        delete[] _types;
> +    }
> +
>      virtual void response(AbstractProcessLoop& events_loop);
>  
>  private:
> -    uint32_t _type;
> +    uint32_t *_types;
> +    uint32_t _type_count;
>  };
>  
>  class ClipboardRequestEvent : public Event {
> @@ -207,7 +218,7 @@ public:
>      PixmapCache& get_pixmap_cache() {return _pixmap_cache;}
>      uint64_t get_pixmap_cache_size() { return _pixmap_cache_size;}
>      void on_display_mode_change();
> -    void on_clipboard_grab(uint32_t type);
> +    void on_clipboard_grab(uint32_t *types, uint32_t type_count);
>      void on_clipboard_request(uint32_t type);
>      void on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size);
>  
> diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp
> index 95876dc..2a62944 100644
> --- a/client/windows/platform.cpp
> +++ b/client/windows/platform.cpp
> @@ -51,7 +51,7 @@ static ProcessLoop* main_loop = NULL;
>  
>  class DefaultClipboardListener: public Platform::ClipboardListener {
>  public:
> -    virtual void on_clipboard_grab(uint32_t type) {}
> +    virtual void on_clipboard_grab(uint32_t *types, uint32_t type_count) {}
>      virtual void on_clipboard_request(uint32_t type) {}
>      virtual void on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size) {}
>  };
> @@ -151,7 +151,7 @@ static LRESULT CALLBACK PlatformWinProc(HWND hWnd, UINT message, WPARAM wParam,
>          if (!clipboard_changer) {
>              uint32_t type = get_available_clipboard_type();            
>              if (type) {
> -                clipboard_listener->on_clipboard_grab(type);
> +                clipboard_listener->on_clipboard_grab(&type, 1);
>              } else {
>                  LOG_INFO("Unsupported clipboard format");
>              }
> @@ -856,12 +856,13 @@ void WinPlatform::exit_modal_loop()
>      modal_loop_active = false;
>  }
>  
> -bool Platform::set_clipboard_owner(uint32_t type)
> +bool Platform::set_clipboard_owner(uint32_t *types, uint32_t type_count)
>  {
> -    uint32_t format = get_clipboard_format(type);
> +    /* FIXME use all types rather then just the first one */
> +    uint32_t format = get_clipboard_format(types[0]);
>      
>      if (!format) {
> -        LOG_INFO("Unsupported clipboard type %u", type);
> +        LOG_INFO("Unsupported clipboard type %u", types[0]);
>          return false;
>      }
>      if (!OpenClipboard(platform_win)) {
> diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
> index 8f4ed2d..6627187 100644
> --- a/client/x11/platform.cpp
> +++ b/client/x11/platform.cpp
> @@ -151,7 +151,7 @@ static Platform::DisplayModeListener* display_mode_listener = &default_display_m
>  
>  class DefaultClipboardListener: public Platform::ClipboardListener {
>  public:
> -    void on_clipboard_grab(uint32_t type) {}
> +    void on_clipboard_grab(uint32_t *types, uint32_t type_count) {}
>      void on_clipboard_request(uint32_t type) {}
>      void on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size) {}
>  };
> @@ -2392,7 +2392,8 @@ static void root_win_proc(XEvent& event)
>              return;
>          }
>          // FIXME: use actual type
> -        clipboard_listener->on_clipboard_grab(VD_AGENT_CLIPBOARD_UTF8_TEXT);
> +        uint32_t type = VD_AGENT_CLIPBOARD_UTF8_TEXT;
> +        clipboard_listener->on_clipboard_grab(&type, 1);
>          return;
>      }
>      switch (event.type) {
> @@ -3144,13 +3145,14 @@ LocalCursor* Platform::create_default_cursor()
>      return new XDefaultCursor();
>  }
>  
> -bool Platform::set_clipboard_owner(uint32_t type)
> +bool Platform::set_clipboard_owner(uint32_t *types, uint32_t type_count)
>  {
>      Lock lock(clipboard_lock);
> -    uint32_t format = get_clipboard_format(type);
> +    /* FIXME use all types rather then just the first one */
> +    uint32_t format = get_clipboard_format(types[0]);
>  
>      if (!format) {
> -        LOG_INFO("Unsupported clipboard type %u", type);
> +        LOG_INFO("Unsupported clipboard type %u", types[0]);
>          return false;
>      }
>      clipboard_changer = true;
>   
Ack


More information about the Spice-devel mailing list