2008-11-21 15:57:01 +01:00
|
|
|
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
|
2008-12-05 15:30:41 +01:00
|
|
|
@@ -352,6 +352,11 @@ static void vnc_dpy_update(DisplayState
|
2008-11-21 15:57:01 +01:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2008-12-05 15:30:41 +01:00
|
|
|
@@ -419,9 +424,13 @@ static void vnc_dpy_resize_shared(Displa
|
2008-11-21 15:57:01 +01:00
|
|
|
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);
|
2008-12-05 15:30:41 +01:00
|
|
|
@@ -1808,6 +1817,31 @@ static int protocol_client_msg(VncState
|
2008-11-21 15:57:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|