The display channel emits "notify::monitor" only when its display is enabled. If the display is not enabled then it is not listed in the "View -> Displays" menu, because display widgets are created as a reaction to the "notify::monitor". Creating display widgets at the moment the channel connects makes sure that displays are listed the "View -> Displays" menu and can be enabled. Resolves: https://bugs.freedesktop.org/show_bug.cgi?id=91489 --- src/virt-viewer-session-spice.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c index 9976291..67d5a3f 100644 --- a/src/virt-viewer-session-spice.c +++ b/src/virt-viewer-session-spice.c @@ -766,9 +766,8 @@ destroy_display(gpointer data) } static void -virt_viewer_session_spice_display_monitors(SpiceChannel *channel, - GParamSpec *pspec G_GNUC_UNUSED, - VirtViewerSessionSpice *self) +virt_viewer_session_spice_create_displays_for_channel(VirtViewerSessionSpice *self, + SpiceChannel *channel) { GArray *monitors = NULL; GPtrArray *displays = NULL; @@ -803,6 +802,29 @@ virt_viewer_session_spice_display_monitors(SpiceChannel *channel, } } + g_clear_pointer(&monitors, g_array_unref); +} + +static void +virt_viewer_session_spice_display_monitors(SpiceChannel *channel, + GParamSpec *pspec G_GNUC_UNUSED, + VirtViewerSessionSpice *self) +{ + GArray *monitors = NULL; + GPtrArray *displays = NULL; + GtkWidget *display; + guint i, monitors_max; + + g_object_get(channel, + "monitors", &monitors, + "monitors-max", &monitors_max, + NULL); + g_return_if_fail(monitors != NULL); + g_return_if_fail(monitors->len <= monitors_max); + + virt_viewer_session_spice_create_displays_for_channel(self, channel); + displays = g_object_get_data(G_OBJECT(channel), "virt-viewer-displays"); + for (i = 0; i < monitors->len; i++) { SpiceDisplayMonitorConfig *monitor = &g_array_index(monitors, SpiceDisplayMonitorConfig, i); display = g_ptr_array_index(displays, monitor->id); @@ -856,6 +878,7 @@ virt_viewer_session_spice_channel_new(SpiceSession *s, } if (SPICE_IS_DISPLAY_CHANNEL(channel)) { + virt_viewer_session_spice_create_displays_for_channel(self, channel); g_signal_emit_by_name(session, "session-initialized"); virt_viewer_signal_connect_object(channel, "notify::monitors", -- 2.4.6 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list