[Spice-devel] [PATCH spice-gtk] main: do not send monitors config if some are missing

Hans de Goede hdegoede at redhat.com
Thu May 9 03:38:16 PDT 2013


Hi,

Looks good, ack.

Regards,

Hans


On 05/08/2013 10:22 PM, Marc-André Lureau wrote:
> Spice-gtk does a bit of client-side work by optionnally delaying sending
> the monitor configuration to the guest automatically. However, the
> client may be slow to set all the monitors, so teach the timer to not
> fire the event unless at least the number of monitors set explicitely
> enabled or disabled matches the number of display channels.
>
> This avoid some configuration races when connecting to a multi-channel
> display server which is slow to set up.
> ---
>   gtk/channel-main.c | 24 +++++++++++++++++++++---
>   1 file changed, 21 insertions(+), 3 deletions(-)
>
> diff --git a/gtk/channel-main.c b/gtk/channel-main.c
> index 623ff79..2e9fac7 100644
> --- a/gtk/channel-main.c
> +++ b/gtk/channel-main.c
> @@ -96,6 +96,7 @@ struct _SpiceMainChannelPrivate  {
>           int                     width;
>           int                     height;
>           gboolean                enabled;
> +        gboolean                enabled_set;
>       } display[MAX_DISPLAY];
>       gint                        timer_id;
>       GQueue                      *agent_msg_queue;
> @@ -1327,10 +1328,24 @@ static gboolean timer_set_display(gpointer data)
>   {
>       SpiceMainChannel *channel = data;
>       SpiceMainChannelPrivate *c = channel->priv;
> +    SpiceSession *session;
> +    gint i;
>
>       c->timer_id = 0;
> -    if (c->agent_connected)
> -        spice_main_send_monitor_config(channel);
> +    if (!c->agent_connected)
> +        return FALSE;
> +
> +    session = spice_channel_get_session(SPICE_CHANNEL(channel));
> +
> +    /* ensure we have an explicit monitor configuration at least for
> +       number of display channels */
> +    for (i = 0; i < session->priv->display_channels_count; i++)
> +        if (!c->display[i].enabled_set) {
> +            SPICE_DEBUG("Not sending monitors config, missing monitors");
> +            return FALSE;
> +        }
> +
> +    spice_main_send_monitor_config(channel);
>
>       return FALSE;
>   }
> @@ -2609,13 +2624,16 @@ void spice_main_set_display_enabled(SpiceMainChannel *channel, int id, gboolean
>
>       if (id == -1) {
>           gint i;
> -        for (i = 0; i < G_N_ELEMENTS(c->display); i++)
> +        for (i = 0; i < G_N_ELEMENTS(c->display); i++) {
>               c->display[i].enabled = enabled;
> +            c->display[i].enabled_set = TRUE;
> +        }
>       } else {
>           g_return_if_fail(id < G_N_ELEMENTS(c->display));
>           if (c->display[id].enabled == enabled)
>               return;
>           c->display[id].enabled = enabled;
> +        c->display[id].enabled_set = TRUE;
>       }
>
>       update_display_timer(channel, 1);
>


More information about the Spice-devel mailing list