summaryrefslogtreecommitdiffstats
path: root/server/red_dispatcher.c
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2012-06-07 15:04:51 +0300
committerAlon Levy <alevy@redhat.com>2012-07-22 13:50:49 +0300
commit0acea04d71f28e98b15620e31902dd8e2196c637 (patch)
tree8a8488971d761945e8bf8c75705e7e2cbb7e5f2f /server/red_dispatcher.c
parente29dc5250cb12cf42b6875d5a7e4bd77d2897d74 (diff)
downloadspice-0acea04d71f28e98b15620e31902dd8e2196c637.tar.gz
spice-0acea04d71f28e98b15620e31902dd8e2196c637.tar.xz
spice-0acea04d71f28e98b15620e31902dd8e2196c637.zip
server: add monitors_config support
a SpiceMsgDisplayMonitorsConfig is sent on two occasions: * as a result of a spice_qxl_monitors_config_async * whenever a client connects and there is a previously set monitors config Sending the new message is protected by a new cap, SPICE_DISPLAY_CAP_MONITORS_CONFIG More elaborately: spice_qxl_monitors_config_async receives a QXLPHYSICAL address of a QXLMonitorsConfig struct and reads it, caching it in the RedWorker, and sending it to all clients. Whenever a new client connects it receives a SpiceMsgDisplayMonitorsConfig message as well.
Diffstat (limited to 'server/red_dispatcher.c')
-rw-r--r--server/red_dispatcher.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c
index 6b96a2e8..8d9c073a 100644
--- a/server/red_dispatcher.c
+++ b/server/red_dispatcher.c
@@ -648,6 +648,21 @@ static void red_dispatcher_flush_surfaces_async(RedDispatcher *dispatcher, uint6
dispatcher_send_message(&dispatcher->dispatcher, message, &payload);
}
+static void red_dispatcher_monitors_config_async(RedDispatcher *dispatcher,
+ QXLPHYSICAL monitors_config,
+ int group_id,
+ uint64_t cookie)
+{
+ RedWorkerMessageMonitorsConfigAsync payload;
+ RedWorkerMessage message = RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC;
+
+ payload.base.cmd = async_command_alloc(dispatcher, message, cookie);
+ payload.monitors_config = monitors_config;
+ payload.group_id = group_id;
+
+ dispatcher_send_message(&dispatcher->dispatcher, message, &payload);
+}
+
static void red_dispatcher_stop(RedDispatcher *dispatcher)
{
RedWorkerMessageStop payload;
@@ -908,6 +923,13 @@ void spice_qxl_flush_surfaces_async(QXLInstance *instance, uint64_t cookie)
red_dispatcher_flush_surfaces_async(instance->st->dispatcher, cookie);
}
+SPICE_GNUC_VISIBLE
+void spice_qxl_monitors_config_async(QXLInstance *instance, QXLPHYSICAL monitors_config,
+ int group_id, uint64_t cookie)
+{
+ red_dispatcher_monitors_config_async(instance->st->dispatcher, monitors_config, group_id, cookie);
+}
+
void red_dispatcher_async_complete(struct RedDispatcher *dispatcher,
AsyncCommand *async_command)
{
@@ -935,6 +957,8 @@ void red_dispatcher_async_complete(struct RedDispatcher *dispatcher,
break;
case RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC:
break;
+ case RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC:
+ break;
default:
spice_warning("unexpected message %d", async_command->message);
}
@@ -1054,6 +1078,7 @@ RedDispatcher *red_dispatcher_init(QXLInstance *qxl)
client_cbs.migrate = red_dispatcher_display_migrate;
red_channel_register_client_cbs(display_channel, &client_cbs);
red_channel_set_data(display_channel, red_dispatcher);
+ red_channel_set_cap(display_channel, SPICE_DISPLAY_CAP_MONITORS_CONFIG);
reds_register_channel(display_channel);
}