[virt-tools-list] [PATCH virt-viewer v4 3/3] session-spice: Disable extra displays in fullscreen mode

Pavel Grunt pgrunt at redhat.com
Mon May 4 15:20:18 UTC 2015


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
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
---
 src/virt-viewer-session-spice.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
index c1333dd..fa1fd1f 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -693,6 +693,16 @@ destroy_display(gpointer data)
     g_object_unref(display);
 }
 
+static gboolean
+display_is_in_fullscreen_mode(VirtViewerSessionSpice *self,
+                              VirtViewerDisplay *display)
+{
+    gconstpointer nth = GINT_TO_POINTER(virt_viewer_display_get_nth(display));
+    VirtViewerApp *app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self));
+
+    return g_list_index(virt_viewer_app_get_initial_displays(app), nth) != -1;
+}
+
 static void
 virt_viewer_session_spice_display_monitors(SpiceChannel *channel,
                                            GParamSpec *pspec G_GNUC_UNUSED,
@@ -702,6 +712,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,
@@ -739,6 +751,18 @@ virt_viewer_session_spice_display_monitors(SpiceChannel *channel,
         if (monitor->width == 0 || monitor->height == 0)
             continue;
 
+        if (fullscreen_mode &&
+            self->priv->did_auto_conf &&
+            !display_is_in_fullscreen_mode(self, VIRT_VIEWER_DISPLAY(display))) {
+            g_debug("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);
+            virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display), FALSE);
+            continue;
+        }
+
         virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display), TRUE);
         virt_viewer_display_spice_set_desktop(VIRT_VIEWER_DISPLAY(display),
                                               monitor->x, monitor->y,
-- 
2.3.6




More information about the virt-tools-list mailing list