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);
_______________________________________________
Spice-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to