[Spice-devel] [PATCH spice-gtk] channel-main: Notify about existence of monitor

Pavel Grunt pgrunt at redhat.com
Thu Jun 11 01:03:59 PDT 2015


SpiceMainChannel should be notify about existence of monitors
assigned to a SpiceDisplayChannel, even when the SpiceDisplayChannel
is not connected to a SpiceDisplay widget. Otherwise the automatic
resizing (the "resize-guest" property) of SpiceDisplay will not work
when there is more display channels than SpiceDisplays.

Fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=90914
---
 src/channel-main.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/channel-main.c b/src/channel-main.c
index c55d097..fbc41da 100644
--- a/src/channel-main.c
+++ b/src/channel-main.c
@@ -1580,18 +1580,36 @@ static void main_handle_mm_time(SpiceChannel *channel, SpiceMsgIn *in)
     spice_session_set_mm_time(session, msg->time);
 }
 
+static void main_enable_monitor(SpiceChannel *channel, GParamSpec *pspec G_GNUC_UNUSED,
+                                SpiceMainChannel *main_channel)
+{
+    gint channel_id = spice_channel_get_channel_id(channel);
+
+    g_return_if_fail(SPICE_IS_DISPLAY_CHANNEL(channel));
+    g_return_if_fail(channel_id < MAX_DISPLAY);
+    g_return_if_fail(main_channel != NULL && main_channel->priv != NULL);
+
+    main_channel->priv->display[channel_id].enabled_set = TRUE;
+}
+
 typedef struct channel_new {
     SpiceSession *session;
     int type;
     int id;
+    SpiceMainChannel *main_channel;
 } channel_new_t;
 
 /* main context */
 static gboolean _channel_new(channel_new_t *c)
 {
+    SpiceChannel *channel;
     g_return_val_if_fail(c != NULL, FALSE);
 
-    spice_channel_new(c->session, c->type, c->id);
+    channel = spice_channel_new(c->session, c->type, c->id);
+    if (SPICE_IS_DISPLAY_CHANNEL(channel)) {
+        spice_g_signal_connect_object(channel, "notify::monitors",
+                                      G_CALLBACK(main_enable_monitor), c->main_channel, 0);
+    }
 
     g_object_unref(c->session);
     g_free(c);
@@ -1619,6 +1637,7 @@ static void main_handle_channels_list(SpiceChannel *channel, SpiceMsgIn *in)
         c->session = g_object_ref(session);
         c->type = msg->channels[i].type;
         c->id = msg->channels[i].id;
+        c->main_channel = SPICE_MAIN_CHANNEL(channel);
         /* no need to explicitely switch to main context, since
            synchronous call is not needed. */
         /* no need to track idle, session is refed */
-- 
2.4.3



More information about the Spice-devel mailing list