[virt-tools-list] [PATCH virt-viewer v2 2/7] SessionSpice: save initial fullscreen configuration

Jonathon Jongsma jjongsma at redhat.com
Tue Apr 21 20:34:30 UTC 2015


Store a copy of the configuration that we send down for initial
fullscreen auto-conf. This will allow us to determine whether the guest
has actually been configured properly.
---
 src/virt-viewer-session-spice.c | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
index 58f2af5..8e93b4a 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -59,6 +59,7 @@ struct _VirtViewerSessionSpicePrivate {
     guint pass_try;
     gboolean did_auto_conf;
     GList *display_channels;
+    GArray *fullscreen_config;
 };
 
 #define VIRT_VIEWER_SESSION_SPICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_SESSION_SPICE, VirtViewerSessionSpicePrivate))
@@ -148,6 +149,7 @@ virt_viewer_session_spice_dispose(GObject *obj)
 
     g_clear_object(&spice->priv->main_window);
     g_clear_pointer(&spice->priv->display_channels, (GDestroyNotify*)g_list_free);
+    g_clear_pointer(&spice->priv->fullscreen_config, g_array_unref);
 
     G_OBJECT_CLASS(virt_viewer_session_spice_parent_class)->dispose(obj);
 }
@@ -829,11 +831,11 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self)
     GdkScreen *screen = gdk_screen_get_default();
     SpiceMainChannel* cmain = virt_viewer_session_spice_get_main_channel(self);
     VirtViewerApp *app = NULL;
-    GdkRectangle *displays;
     gboolean agent_connected;
     gint i;
     GList *initial_displays, *l;
     guint ndisplays;
+    GArray *config;
 
     /* only do auto-conf once at startup. Avoid repeating auto-conf later due to
      * agent disconnection/re-connection, etc */
@@ -866,32 +868,34 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self)
     initial_displays = virt_viewer_app_get_initial_displays(app);
     ndisplays = g_list_length(initial_displays);
     g_debug("Performing full screen auto-conf, %u host monitors", ndisplays);
-    displays = g_new0(GdkRectangle, ndisplays);
+    config = g_array_sized_new(FALSE, TRUE, sizeof(GdkRectangle), ndisplays);
 
     for (i = 0, l = initial_displays; l != NULL; l = l->next, i++) {
-        GdkRectangle* rect = &displays[i];
+        GdkRectangle rect = { 0 };
         gint j = virt_viewer_app_get_initial_monitor_for_display(app, GPOINTER_TO_INT(l->data));
-        if (j == -1)
-            continue;
-
-        gdk_screen_get_monitor_geometry(screen, j, rect);
+        if (j != -1) {
+            gdk_screen_get_monitor_geometry(screen, j, &rect);
+            g_array_append_val(config, rect);
+        }
     }
     g_list_free(initial_displays);
 
-    virt_viewer_shift_monitors_to_origin(displays, ndisplays);
+    virt_viewer_shift_monitors_to_origin((GdkRectangle*)config->data,
+                                         config->len);
 
-    for (i = 0; i < ndisplays; i++) {
-        GdkRectangle *rect = &displays[i];
+    for (i = 0; i < config->len; i++) {
+        GdkRectangle *rect = &g_array_index(config, GdkRectangle, i);
 
         spice_main_set_display(cmain, i, rect->x, rect->y, rect->width, rect->height);
         spice_main_set_display_enabled(cmain, i, TRUE);
         g_debug("Set SPICE display %d to (%d,%d)-(%dx%d)",
                   i, rect->x, rect->y, rect->width, rect->height);
     }
-    g_free(displays);
 
     spice_main_send_monitor_config(cmain);
     self->priv->did_auto_conf = TRUE;
+
+    self->priv->fullscreen_config = config;
     return TRUE;
 }
 
-- 
2.1.0




More information about the virt-tools-list mailing list