[Spice-devel] [PATCH spice v3 4/7] server/red_dispatcher: client_monitors_config support

Alon Levy alevy at redhat.com
Wed Sep 12 06:13:35 PDT 2012


Adds two functions:
 - red_dispatcher_use_client_monitors_config:
   check that QXLInterface supports client_monitors_config and that it's
   functional.
 - red_dispatcher_client_monitors_config:
   send the client monitors configuration to the guest.
---
 server/red_dispatcher.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 server/red_dispatcher.h |  4 ++++
 2 files changed, 53 insertions(+)

diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c
index 3a4229e..39d05ab 100644
--- a/server/red_dispatcher.c
+++ b/server/red_dispatcher.c
@@ -83,6 +83,22 @@ extern spice_wan_compression_t zlib_glz_state;
 
 static RedDispatcher *dispatchers = NULL;
 
+static int red_dispatcher_version_check(int major, int minor)
+{
+    if (num_active_workers > 0) {
+        RedDispatcher *now = dispatchers;
+        while (now) {
+            if (now->base.major_version != major ||
+                now->base.minor_version < minor) {
+                return FALSE;
+            }
+            now = now->next;
+        }
+        return TRUE;
+    }
+    return FALSE;
+}
+
 static void red_dispatcher_set_display_peer(RedChannel *channel, RedClient *client,
                                             RedsStream *stream, int migration,
                                             int num_common_caps, uint32_t *common_caps, int num_caps,
@@ -295,6 +311,39 @@ static void red_dispatcher_update_area(RedDispatcher *dispatcher, uint32_t surfa
                             &payload);
 }
 
+int red_dispatcher_use_client_monitors_config(void)
+{
+    RedDispatcher *now = dispatchers;
+
+    if (num_active_workers == 0) {
+        return FALSE;
+    }
+
+    for (; now ; now = now->next) {
+        if (!red_dispatcher_version_check(3, 3) ||
+            !now->qxl->st->qif->client_monitors_config ||
+            !now->qxl->st->qif->client_monitors_config(now->qxl, NULL)) {
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+
+void red_dispatcher_client_monitors_config(VDAgentMonitorsConfig *monitors_config)
+{
+    RedDispatcher *now = dispatchers;
+
+    while (now) {
+        if (!now->qxl->st->qif->client_monitors_config ||
+            !now->qxl->st->qif->client_monitors_config(now->qxl,
+                                                       monitors_config)) {
+            spice_warning("spice bug: QXLInterface::client_monitors_config"
+                          " failed/missing unexpectedly\n");
+        }
+        now = now->next;
+    }
+}
+
 static AsyncCommand *async_command_alloc(RedDispatcher *dispatcher,
                                          RedWorkerMessage message,
                                          uint64_t cookie)
diff --git a/server/red_dispatcher.h b/server/red_dispatcher.h
index 7e9ffe6..17eeb29 100644
--- a/server/red_dispatcher.h
+++ b/server/red_dispatcher.h
@@ -18,6 +18,8 @@
 #ifndef _H_RED_DISPATCHER
 #define _H_RED_DISPATCHER
 
+#include "red_channel.h"
+
 struct RedChannelClient;
 typedef struct AsyncCommand AsyncCommand;
 
@@ -35,6 +37,8 @@ uint32_t red_dispatcher_qxl_ram_size(void);
 int red_dispatcher_qxl_count(void);
 void red_dispatcher_async_complete(struct RedDispatcher *, AsyncCommand *);
 struct Dispatcher *red_dispatcher_get_dispatcher(struct RedDispatcher *);
+int red_dispatcher_use_client_monitors_config(void);
+void red_dispatcher_client_monitors_config(VDAgentMonitorsConfig *monitors_config);
 
 typedef struct RedWorkerMessageDisplayConnect {
     RedClient * client;
-- 
1.7.12



More information about the Spice-devel mailing list