[Spice-devel] [PATCH spice-gtk] Send monitor config when enough display channels are connected

Pavel Grunt pgrunt at redhat.com
Thu Jun 11 02:49:43 PDT 2015


Fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=90914
---
 src/channel-main.c       |  2 +-
 src/spice-session-priv.h |  1 +
 src/spice-session.c      | 25 +++++++++++++++++++++++++
 3 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/src/channel-main.c b/src/channel-main.c
index fbc41da..6344d0c 100644
--- a/src/channel-main.c
+++ b/src/channel-main.c
@@ -1425,7 +1425,7 @@ static gboolean timer_set_display(gpointer data)
 
     /* ensure we have an explicit monitor configuration at least for
        number of display channels */
-    for (i = 0; i < spice_session_get_n_display_channels(session); i++)
+    for (i = 0; i < spice_session_get_n_connected_display_channels(session); i++)
         if (!c->display[i].enabled_set) {
             SPICE_DEBUG("Not sending monitors config, missing monitors");
             return FALSE;
diff --git a/src/spice-session-priv.h b/src/spice-session-priv.h
index 049973a..203bbc0 100644
--- a/src/spice-session-priv.h
+++ b/src/spice-session-priv.h
@@ -96,6 +96,7 @@ const guint8* spice_session_get_webdav_magic(SpiceSession *session);
 PhodavServer *spice_session_get_webdav_server(SpiceSession *session);
 PhodavServer* channel_webdav_server_new(SpiceSession *session);
 guint spice_session_get_n_display_channels(SpiceSession *session);
+guint spice_session_get_n_connected_display_channels(SpiceSession *session);
 void spice_session_set_main_channel(SpiceSession *session, SpiceChannel *channel);
 gboolean spice_session_set_migration_session(SpiceSession *session, SpiceSession *mig_session);
 SpiceAudio *spice_audio_get(SpiceSession *session, GMainContext *context);
diff --git a/src/spice-session.c b/src/spice-session.c
index 778d82a..5154bcc 100644
--- a/src/spice-session.c
+++ b/src/spice-session.c
@@ -2452,6 +2452,31 @@ guint spice_session_get_n_display_channels(SpiceSession *session)
 }
 
 G_GNUC_INTERNAL
+guint spice_session_get_n_connected_display_channels(SpiceSession *session)
+{
+    SpiceSessionPrivate *s;
+    struct channel *item;
+    RingItem *ring;
+    guint channels = 0;
+
+    g_return_val_if_fail(SPICE_IS_SESSION(session), 0);
+    g_return_val_if_fail(session->priv != NULL, 0);
+
+    s = session->priv;
+
+    for (ring = ring_get_head(&s->channels);
+         ring != NULL;
+         ring = ring_next(&s->channels, ring)) {
+        item = SPICE_CONTAINEROF(ring, struct channel, link);
+        if (SPICE_IS_DISPLAY_CHANNEL(item->channel) &&
+            spice_channel_get_state(item->channel) != SPICE_CHANNEL_STATE_UNCONNECTED) {
+            channels++;
+        }
+    }
+    return channels;
+}
+
+G_GNUC_INTERNAL
 void spice_session_set_uuid(SpiceSession *session, guint8 uuid[16])
 {
     g_return_if_fail(SPICE_IS_SESSION(session));
-- 
2.4.3



More information about the Spice-devel mailing list