session-spice: Disable extra displays in fullscreen mode

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
This commit is contained in:
Pavel Grunt 2015-04-29 11:24:51 +02:00
parent 1f2ef0e9de
commit 7870ea5eff

View File

@ -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)