diff options
author | Alon Levy <alevy@redhat.com> | 2012-06-07 15:04:51 +0300 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2012-07-22 13:50:49 +0300 |
commit | 0acea04d71f28e98b15620e31902dd8e2196c637 (patch) | |
tree | 8a8488971d761945e8bf8c75705e7e2cbb7e5f2f /server/red_dispatcher.c | |
parent | e29dc5250cb12cf42b6875d5a7e4bd77d2897d74 (diff) | |
download | spice-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.c | 25 |
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); } |