This is a new function that allows the caller to decide whether to send the new status down to the server or not (analogous to the difference between spice_main_set_display() vs spice_man_update_display()). This new function is needed to reduce unnecessary MonitorsConfig messages from being sent to the server. Because spice-gtk does not maintain any display state internally, it depends on the application to maintain that state. Some state changes come from the server itself (e.g. the guest has changed resolution due to some activity within the guest), and some come from the application (e.g. the user has resized the window of the client). Changes that come from server updates do not need to be sent back down to the server, whereas those that originate from the application *do* need to be sent to the server. --- src/channel-main.c | 40 ++++++++++++++++++++++++++++++++-------- src/channel-main.h | 1 + src/map-file | 1 + src/spice-glib-sym-file | 1 + 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/channel-main.c b/src/channel-main.c index 1b9c4d4..e4484e3 100644 --- a/src/channel-main.c +++ b/src/channel-main.c @@ -2756,19 +2756,24 @@ void spice_main_clipboard_selection_request(SpiceMainChannel *channel, guint sel } /** - * spice_main_set_display_enabled: + * spice_main_update_display_enabled: * @channel: a #SpiceMainChannel * @id: display ID (if -1: set all displays) * @enabled: wether display @id is enabled + * @update: if %TRUE, update guest display state after 1sec. * - * When sending monitor configuration to agent guest, don't set - * display @id, which the agent translates to disabling the display - * id. Note: this will take effect next time the monitor - * configuration is sent. + * When sending monitor configuration to agent guest, if @enabled is %FALSE, + * don't set display @id, which the agent translates to disabling the display + * id. If @enabled is %TRUE, the monitor will be included in the next monitor + * update. Note: this will take effect next time the monitor configuration is + * sent. * - * Since: 0.6 + * If @update is %FALSE, no server update will be triggered by this call, but + * the value will be saved and used in the next configuration update. + * + * Since: 0.30 **/ -void spice_main_set_display_enabled(SpiceMainChannel *channel, int id, gboolean enabled) +void spice_main_update_display_enabled(SpiceMainChannel *channel, int id, gboolean enabled, gboolean update) { SpiceDisplayState display_state = enabled ? DISPLAY_ENABLED : DISPLAY_DISABLED; g_return_if_fail(channel != NULL); @@ -2789,7 +2794,26 @@ void spice_main_set_display_enabled(SpiceMainChannel *channel, int id, gboolean c->display[id].display_state = display_state; } - update_display_timer(channel, 1); + if (update) + update_display_timer(channel, 1); +} + +/** + * spice_main_set_display_enabled: + * @channel: a #SpiceMainChannel + * @id: display ID (if -1: set all displays) + * @enabled: wether display @id is enabled + * + * When sending monitor configuration to agent guest, don't set + * display @id, which the agent translates to disabling the display + * id. Note: this will take effect next time the monitor + * configuration is sent. + * + * Since: 0.6 + **/ +void spice_main_set_display_enabled(SpiceMainChannel *channel, int id, gboolean enabled) +{ + spice_main_update_display_enabled(channel, id, enabled, TRUE); } static void file_xfer_completed(SpiceFileXferTask *task, GError *error) diff --git a/src/channel-main.h b/src/channel-main.h index 3e4fc42..86bb46b 100644 --- a/src/channel-main.h +++ b/src/channel-main.h @@ -72,6 +72,7 @@ void spice_main_set_display(SpiceMainChannel *channel, int id, void spice_main_update_display(SpiceMainChannel *channel, int id, int x, int y, int width, int height, gboolean update); void spice_main_set_display_enabled(SpiceMainChannel *channel, int id, gboolean enabled); +void spice_main_update_display_enabled(SpiceMainChannel *channel, int id, gboolean enabled, gboolean update); gboolean spice_main_send_monitor_config(SpiceMainChannel *channel); void spice_main_clipboard_selection_grab(SpiceMainChannel *channel, guint selection, guint32 *types, int ntypes); diff --git a/src/map-file b/src/map-file index d5a073f..a9abc61 100644 --- a/src/map-file +++ b/src/map-file @@ -71,6 +71,7 @@ spice_main_send_monitor_config; spice_main_set_display; spice_main_set_display_enabled; spice_main_update_display; +spice_main_update_display_enabled; spice_playback_channel_get_type; spice_playback_channel_set_delay; spice_port_channel_get_type; diff --git a/src/spice-glib-sym-file b/src/spice-glib-sym-file index 3a8da93..1d62716 100644 --- a/src/spice-glib-sym-file +++ b/src/spice-glib-sym-file @@ -48,6 +48,7 @@ spice_main_send_monitor_config spice_main_set_display spice_main_set_display_enabled spice_main_update_display +spice_main_update_display_enabled spice_playback_channel_get_type spice_playback_channel_set_delay spice_port_channel_get_type -- 2.1.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel