From 21da1f659d5cca414c83580816f9da2b3de5445e Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
Date: Thu, 3 Jun 2010 10:09:47 -0300
Subject: [PATCH 16/20] vnc: keep track of client desktop size

RH-Author: Gerd Hoffmann <kraxel@redhat.com>
Message-id: <1275559789-2280-4-git-send-email-kraxel@redhat.com>
Patchwork-id: 9695
O-Subject: [RHEL-6 kvm PATCH 3/5] vnc: keep track of client desktop size
Bugzilla: 590070
RH-Acked-by: Jes Sorensen <Jes.Sorensen@redhat.com>
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
RH-Acked-by: Amit Shah <amit.shah@redhat.com>

Add two new variables to keep track of the vnc clients desktop size.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>

bugzilla: #590070 -- QEMU misses DESKTOP-RESIZE event if it is triggered
                     during client connection initialization
upstream: 5862d195f90cb63c53b9dc3f54e10f8b9372bcf6
---
 vnc.c |   10 +++++++---
 vnc.h |    2 ++
 2 files changed, 9 insertions(+), 3 deletions(-)

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 vnc.c |   10 +++++++---
 vnc.h |    2 ++
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/vnc.c b/vnc.c
index 9be6ac7..0741329 100644
--- a/vnc.c
+++ b/vnc.c
@@ -522,10 +522,12 @@ static void vnc_desktop_resize(VncState *vs)
     if (vs->csock == -1 || !vnc_has_feature(vs, VNC_FEATURE_RESIZE)) {
         return;
     }
+    vs->client_width = ds_get_width(ds);
+    vs->client_height = ds_get_height(ds);
     vnc_write_u8(vs, 0); /* VNC_MSG_SERVER_FRAMEBUFFER_UPDATE */
     vnc_write_u8(vs, 0);
     vnc_write_u16(vs, 1); /* number of rects */
-    vnc_framebuffer_update(vs, 0, 0, ds_get_width(ds), ds_get_height(ds),
+    vnc_framebuffer_update(vs, 0, 0, vs->client_width, vs->client_height,
                            VNC_ENCODING_DESKTOPRESIZE);
     vnc_flush(vs);
 }
@@ -2104,8 +2106,10 @@ static int protocol_client_init(VncState *vs, uint8_t *data, size_t len)
     char buf[1024];
     int size;
 
-    vnc_write_u16(vs, ds_get_width(vs->ds));
-    vnc_write_u16(vs, ds_get_height(vs->ds));
+    vs->client_width = ds_get_width(vs->ds);
+    vs->client_height = ds_get_height(vs->ds);
+    vnc_write_u16(vs, vs->client_width);
+    vnc_write_u16(vs, vs->client_height);
 
     pixel_format_message(vs);
 
diff --git a/vnc.h b/vnc.h
index 71280cb..724b12a 100644
--- a/vnc.h
+++ b/vnc.h
@@ -129,6 +129,8 @@ struct VncState
     int absolute;
     int last_x;
     int last_y;
+    int client_width;
+    int client_height;
 
     uint32_t vnc_encoding;
     uint8_t tight_quality;
-- 
1.7.0.3