When running in fullscreen it is possible to end up in a situation where we have more displays enabled than monitors. This can happen if displays that were enabled in the previous connection to the guest doesn't match displays requested when entering the fullscreen mode. This commit solves the problem by disabling displays that should not be enabled in the fullscreen mode. Resolves: rhbz#1212802 --- v1: https://www.redhat.com/archives/virt-tools-list/2015-April/msg00184.html v2: - nth is not used to determine which display should be enabled, but the list of fullscreen displays is used - the extra display is disabled instead of being ignored v3: - added missing check for self->priv->did_auto_conf to fix hidden display when --reconnect v4: - due to PATCH 2/3 it is possible to use virt_viewer_app_get_initial_displays() to get fullscreen mode displays v5: - fixed the leak of virt_viewer_app_get_initial_displays() - https://www.redhat.com/archives/virt-tools-list/2015-May/msg00014.html v6: - rebased - changed debug to warning - due to recent changes (aff6c79ae080db286e4cb853cdfa02f2da0d0398, thanks Jonathon) other patches from the series are no longer needed v7: - fixed the missing word in the commit log - avoid allocating a list in display_is_in_fullscreen_mode() by using virt_viewer_app_get_initial_monitor_for_display() --- src/virt-viewer-session-spice.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c index eb0761d..b9cae5e 100644 --- a/src/virt-viewer-session-spice.c +++ b/src/virt-viewer-session-spice.c @@ -838,6 +838,16 @@ destroy_display(gpointer data) g_object_unref(display); } +static gboolean +display_is_in_fullscreen_mode(VirtViewerSessionSpice *self, + VirtViewerDisplay *display) +{ + gint nth = virt_viewer_display_get_nth(display); + VirtViewerApp *app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self)); + + return virt_viewer_app_get_initial_monitor_for_display(app, nth) != -1; +} + static void virt_viewer_session_spice_display_monitors(SpiceChannel *channel, GParamSpec *pspec G_GNUC_UNUSED, @@ -847,6 +857,8 @@ virt_viewer_session_spice_display_monitors(SpiceChannel *channel, GPtrArray *displays = NULL; GtkWidget *display; guint i, monitors_max; + gboolean fullscreen_mode = + virt_viewer_app_get_fullscreen(virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self))); g_object_get(channel, "monitors", &monitors, @@ -883,6 +895,16 @@ virt_viewer_session_spice_display_monitors(SpiceChannel *channel, display = g_ptr_array_index(displays, monitor->id); g_return_if_fail(display != NULL); + if (!disabled && fullscreen_mode && self->priv->did_auto_conf && + !display_is_in_fullscreen_mode(self, VIRT_VIEWER_DISPLAY(display))) { + g_warning("display %d should not be enabled, disabling", + virt_viewer_display_get_nth(VIRT_VIEWER_DISPLAY(display))); + spice_main_set_display_enabled(virt_viewer_session_spice_get_main_channel(self), + virt_viewer_display_get_nth(VIRT_VIEWER_DISPLAY(display)), + FALSE); + disabled = TRUE; + } + virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display), !disabled); if (disabled) -- 2.5.0 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list