summaryrefslogtreecommitdiffstats
path: root/src/virt-viewer-session.c
diff options
context:
space:
mode:
authorJonathon Jongsma <jjongsma@redhat.com>2013-11-13 16:39:43 -0600
committerJonathon Jongsma <jjongsma@redhat.com>2013-11-27 10:35:22 -0600
commit03bf8d3051b8be5569a7fa39c9bdfd27480f9522 (patch)
treed8b436edb337a07b2960283b39fd1f20f5d08fc2 /src/virt-viewer-session.c
parent81f70304edcb44a800f5e7ba2272d7852a88b8ed (diff)
downloadvirt-viewer-03bf8d3051b8be5569a7fa39c9bdfd27480f9522.tar.gz
virt-viewer-03bf8d3051b8be5569a7fa39c9bdfd27480f9522.tar.xz
virt-viewer-03bf8d3051b8be5569a7fa39c9bdfd27480f9522.zip
Create a sparse array for monitor-geometry-changed
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 a warning that nth is not less than nmonitors. So find the highest display ID and then create an array of that size, leaving missing displays initialized to 0
Diffstat (limited to 'src/virt-viewer-session.c')
-rw-r--r--src/virt-viewer-session.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c
index 24f0c72..20d5fb1 100644
--- a/src/virt-viewer-session.c
+++ b/src/virt-viewer-session.c
@@ -393,13 +393,22 @@ 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);
+
+ nmonitors = MAX(nth + 1, nmonitors);
+ }
+
monitors = g_new0(GdkRectangle, nmonitors);
for (GList *l = self->priv->displays; l; l = l->next) {
VirtViewerDisplay *d = VIRT_VIEWER_DISPLAY(l->data);