File ioemu-vnc-resize.patch of Package xen

Index: xen-3.3.1-testing/tools/ioemu-remote/vnc.c
===================================================================
--- xen-3.3.1-testing.orig/tools/ioemu-remote/vnc.c
+++ xen-3.3.1-testing/tools/ioemu-remote/vnc.c
@@ -352,6 +352,11 @@ static void vnc_dpy_update(DisplayState 
 {
     VncState *vs = ds->opaque;
 
+    x = MIN(x, vs->width);
+    y = MIN(y, vs->height);
+    w = MIN(w, vs->width - x);
+    h = MIN(h, vs->height - y);
+
     set_bits_in_row(vs, vs->dirty_row, x, y, w, h);
 }
 
@@ -419,9 +424,13 @@ static void vnc_dpy_resize_shared(Displa
     size_changed = ds->width != w || ds->height != h;
     ds->width = w;
     ds->height = h;
-    if (vs->csock != -1 && vs->has_resize && size_changed) {
+    if (size_changed) {
         vs->width = ds->width;
         vs->height = ds->height;
+        VNC_DEBUG("vs->width = %d, vs->height = %d\n",
+            ds->width, ds->height);
+    }
+    if (vs->csock != -1 && vs->has_resize && size_changed) {
         if (vs->update_requested) {
 	    vnc_write_u8(vs, 0);  /* msg id */
 	    vnc_write_u8(vs, 0);
@@ -1808,6 +1817,31 @@ static int protocol_client_msg(VncState 
 	}
 
 	set_encodings(vs, (int32_t *)(data + 4), limit);
+
+    /*
+     * The initialization of a VNC connection can race with xenfb changing
+     * the resolution. This happens when the VNC connection is already
+     * established, but the client has not yet advertised has_resize, so it
+     * won't get notified of the switch.
+     *
+     * Therefore we resend the resolution as soon as the client has sent its
+     * encodings.
+     */
+     if (vs->has_resize) {
+         /* Resize the VNC window */
+         vnc_write_u8(vs, 0);  /* msg id */
+         vnc_write_u8(vs, 0);
+         vnc_write_u16(vs, 1); /* number of rects */
+         vnc_framebuffer_update(vs, 0, 0, vs->ds->width, vs->ds->height, -223);
+
+         /* Ensure that the new area is updated */
+         vnc_write_u8(vs, 0);  /* msg id */
+         vnc_write_u8(vs, 0);
+         vnc_write_u16(vs, 1); /* number of rects */
+         send_framebuffer_update(vs, 0, 0, vs->ds->width, vs->ds->height);
+
+         vnc_flush(vs);
+     }
 	break;
     case 3:
 	if (len == 1)
openSUSE Build Service is sponsored by