summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Grunt <pgrunt@redhat.com>2015-04-29 11:24:51 +0200
committerPavel Grunt <pgrunt@redhat.com>2015-11-04 14:03:32 +0100
commit7870ea5eff91dd163e43f85b4168dd35def0e3e2 (patch)
treed62387100c0ccc9cd410301f56383c90108b4218
parent1f2ef0e9de4133c375df3b20993c93d66fa7f172 (diff)
downloadvirt-viewer-7870ea5eff91dd163e43f85b4168dd35def0e3e2.tar.gz
virt-viewer-7870ea5eff91dd163e43f85b4168dd35def0e3e2.tar.xz
virt-viewer-7870ea5eff91dd163e43f85b4168dd35def0e3e2.zip
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
-rw-r--r--src/virt-viewer-session-spice.c22
1 files changed, 22 insertions, 0 deletions
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)