[virt-tools-list] [PATCH 2/2] Create a sparse array for monitor-geometry-changed

Jonathon Jongsma jjongsma at redhat.com
Thu Nov 14 17:53:57 UTC 2013


It's possible to have only display N enabled without having all of the displays
before it. I experienced this a couple times with a windows guest where display
1 would show up before display 0 and we'd hit this warning. So find the highest
display ID and then create an array of that size, leaving missing displays
initialized to 0
---
 src/virt-viewer-session.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c
index 24f0c72..b2ce1d6 100644
--- a/src/virt-viewer-session.c
+++ b/src/virt-viewer-session.c
@@ -393,13 +393,23 @@ virt_viewer_session_on_monitor_geometry_changed(VirtViewerSession* self,
 {
     VirtViewerSessionClass *klass;
     gboolean all_fullscreen = TRUE;
-    guint nmonitors = g_list_length(self->priv->displays);
+    guint nmonitors = 0;
     GdkRectangle *monitors = NULL;
 
     klass = VIRT_VIEWER_SESSION_GET_CLASS(self);
     if (!klass->apply_monitor_geometry)
         return;
 
+    /* find highest monitor ID so we can create the sparse array */
+    for (GList *l = self->priv->displays; l; l = l->next) {
+        VirtViewerDisplay *d = VIRT_VIEWER_DISPLAY(l->data);
+        guint nth = 0;
+        g_object_get(d, "nth-display", &nth, NULL);
+
+        if ((nth + 1) > nmonitors)
+            nmonitors = nth + 1;
+    }
+
     monitors = g_new0(GdkRectangle, nmonitors);
     for (GList *l = self->priv->displays; l; l = l->next) {
         VirtViewerDisplay *d = VIRT_VIEWER_DISPLAY(l->data);
-- 
1.8.3.1




More information about the virt-tools-list mailing list