From dc69ef49d08cf835bdb480ee68247232c69ad725 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Mon, 10 Sep 2012 18:30:17 +0300 Subject: server/red_dispatcher: client_monitors_config support 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 3a4229e6..39d05ab6 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 7e9ffe68..17eeb291 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; -- cgit