Due to the fullscreen auto-conf changes that cause the application to wait to process monitor updates until the server configuration matches the client's requested configuration, The display channel's "ready" property can become TRUE before the VirtViewerDisplay object gets created. When this happens, virt_viewer_session_add_display() can trigger a notify::show-hint on the display, which will cause us to calculate its minimum zoom level before any of the desktop sizes for the display have been set. This results in an erroneous zoom level, which results in undesirable behavior. For example, leaving fullscreen mode caused the first display to unexpectedly resize to approximately half the width of the client monitor because its minimum zoom level was 190%. To avoid this, we guarantee that all displays are configured (_set_desktop(), _set_enabled()) before we add the display to the session. --- src/virt-viewer-session-spice.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c index d0a7ab5..9a9a337 100644 --- a/src/virt-viewer-session-spice.c +++ b/src/virt-viewer-session-spice.c @@ -731,28 +731,33 @@ virt_viewer_session_spice_process_monitors_for_display_channel(VirtViewerSession g_ptr_array_set_size(displays, monitors_max); for (i = 0; i < monitors_max; i++) { + gboolean create = FALSE; display = g_ptr_array_index(displays, i); - if (display == NULL) { + + create = (display == NULL); + if (create) { display = virt_viewer_display_spice_new(self, channel, i); g_debug("creating spice display (#:%d)", i); g_ptr_array_index(displays, i) = g_object_ref_sink(display); - virt_viewer_session_add_display(VIRT_VIEWER_SESSION(self), - VIRT_VIEWER_DISPLAY(display)); } - } - - for (i = 0; i < monitors->len; i++) { - SpiceDisplayMonitorConfig *monitor = &g_array_index(monitors, SpiceDisplayMonitorConfig, i); - display = g_ptr_array_index(displays, monitor->id); g_return_if_fail(display != NULL); - if (monitor->width == 0 || monitor->height == 0) - continue; + if (i < monitors->len) { + SpiceDisplayMonitorConfig *monitor = &g_array_index(monitors, SpiceDisplayMonitorConfig, i); - virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display), TRUE); - virt_viewer_display_spice_set_desktop(VIRT_VIEWER_DISPLAY(display), - monitor->x, monitor->y, - monitor->width, monitor->height); + if (monitor->width == 0 || monitor->height == 0) + continue; + + virt_viewer_display_spice_set_desktop(VIRT_VIEWER_DISPLAY(display), + monitor->x, monitor->y, + monitor->width, monitor->height); + virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display), TRUE); + } + + if (create) { + virt_viewer_session_add_display(VIRT_VIEWER_SESSION(self), + VIRT_VIEWER_DISPLAY(display)); + } } g_clear_pointer(&monitors, g_array_unref); -- 2.1.0 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list