diff -u gtk-vnc-0.3.4/debian/changelog gtk-vnc-0.3.4/debian/changelog --- gtk-vnc-0.3.4/debian/changelog +++ gtk-vnc-0.3.4/debian/changelog @@ -1,3 +1,18 @@ +gtk-vnc (0.3.4-0ubuntu2) hardy-proposed; urgency=low + + * Cherry-pick fixes from upstream: + - from_upstream_fix_crash_on_closing_connection_lp_207205.patch: + + Fixes a crash when closing the connection on the middle of an + update. LP: #207205. + - from_upstream_fix_endianess_conversion_lp_212504.patch: + + Fixes some big endian conversion bugs, causing wrong colors + in Vinagre. LP: #212504. + - from_upstream_fix_vinagre_connection_lp_206227.patch: + + Fixes clients not being able to connect to some servers. + LP: #206227. + + -- Emilio Pozuelo Monfort Tue, 06 May 2008 11:25:00 +0200 + gtk-vnc (0.3.4-0ubuntu1) hardy; urgency=low * New upstream release (FFe: LP: #199054). only in patch2: unchanged: --- gtk-vnc-0.3.4.orig/debian/patches/from_upstream_fix_endianess_conversion_lp_212504.patch +++ gtk-vnc-0.3.4/debian/patches/from_upstream_fix_endianess_conversion_lp_212504.patch @@ -0,0 +1,170 @@ +# HG changeset patch +# User "Daniel P. Berrange " +# Date 1205940896 14400 +# Node ID 767a847dbdc935b3ea420e0653e22959ba0865a2 +# Parent 7fd767383ac8cb267c3111c7c02a92fb3e0b133a +Fix multiple big-endian conversion bugs + +Index: gtk-vnc/src/blt.h +=================================================================== +--- gtk-vnc.orig/src/blt.h 2008-03-17 18:47:43.000000000 +0100 ++++ gtk-vnc/src/blt.h 2008-03-25 17:23:35.000000000 +0100 +@@ -16,7 +16,7 @@ + #define RGB24_BLIT SPLICE(gvnc_rgb24_blt_, SUFFIX()) + #define TIGHT_COMPUTE_PREDICTED SPLICE(gvnc_tight_compute_predicted_, SUFFIX()) + #define TIGHT_SUM_PIXEL SPLICE(gvnc_tight_sum_pixel_, SUFFIX()) +-#define SWAP(gvnc, pixel) SPLICE(gvnc_swap_, DST)(gvnc, pixel) ++#define SWAP(gvnc, pixel) SPLICE(gvnc_swap_, SRC)(gvnc, pixel) + #define COMPONENT(color, pixel) ((SWAP(gvnc, pixel) >> gvnc->fmt.SPLICE(color, _shift) & gvnc->fmt.SPLICE(color, _max))) + + static void FAST_FILL(struct gvnc *gvnc, src_pixel_t *sp, +@@ -41,18 +41,18 @@ + } + } + +-static void SET_PIXEL(struct gvnc *gvnc, dst_pixel_t *dp, src_pixel_t *sp) ++static void SET_PIXEL(struct gvnc *gvnc, dst_pixel_t *dp, src_pixel_t sp) + { +- *dp = SWAP(gvnc, ((*sp >> gvnc->rrs) & gvnc->rm) << gvnc->rls +- | ((*sp >> gvnc->grs) & gvnc->gm) << gvnc->gls +- | ((*sp >> gvnc->brs) & gvnc->bm) << gvnc->bls); ++ *dp = ((sp >> gvnc->rrs) & gvnc->rm) << gvnc->rls ++ | ((sp >> gvnc->grs) & gvnc->gm) << gvnc->gls ++ | ((sp >> gvnc->brs) & gvnc->bm) << gvnc->bls; + } + + static void SET_PIXEL_AT(struct gvnc *gvnc, int x, int y, src_pixel_t *sp) + { + dst_pixel_t *dp = (dst_pixel_t *)gvnc_get_local(gvnc, x, y); + +- SET_PIXEL(gvnc, dp, sp); ++ SET_PIXEL(gvnc, dp, SWAP(gvnc, *sp)); + } + + static void FILL(struct gvnc *gvnc, src_pixel_t *sp, +@@ -66,7 +66,7 @@ + int j; + + for (j = 0; j < width; j++) { +- SET_PIXEL(gvnc, dp, sp); ++ SET_PIXEL(gvnc, dp, SWAP(gvnc, *sp)); + dp++; + } + dst += gvnc->local.linesize; +@@ -88,7 +88,7 @@ + int j; + + for (j = 0; j < w; j++) { +- SET_PIXEL(gvnc, dp, sp); ++ SET_PIXEL(gvnc, dp, SWAP(gvnc, *sp)); + dp++; + sp++; + } +@@ -171,11 +171,36 @@ + uint32_t *dst = (uint32_t *)pixbuf; + uint8_t *src = image; + uint8_t *alpha = mask; +- int rs, gs, bs; ++ int as, rs, gs, bs, n; + +- rs = 24 - ((sizeof(src_pixel_t) * 8) - gvnc->fmt.red_shift); +- gs = 16 - (gvnc->fmt.red_shift - gvnc->fmt.green_shift); +- bs = 8 - (gvnc->fmt.green_shift - gvnc->fmt.blue_shift); ++ /* ++ * GdkPixbuf is always 32-bit RGB, so we can't use the precomputed ++ * left / right shift data from gvnc->{r,g,b}{r,l}s. The latter ++ * is set for the local display depth, which may be different ++ * to GdkPixbuf's fixed 32-bit RGBA ++ * ++ * This function isn't called often, so just re-compute them now ++ */ ++ ++#if G_BYTE_ORDER == G_BIG_ENDIAN ++ as = 0; ++ rs = 8; ++ gs = 16; ++ bs = 24; ++#else ++ as = 24; ++ rs = 16; ++ gs = 8; ++ bs = 0; ++#endif ++ ++ /* Then this adjusts for remote having less bpp than 32 */ ++ for (n = 255 ; n > gvnc->fmt.red_max ; n>>= 1) ++ rs++; ++ for (n = 255 ; n > gvnc->fmt.green_max ; n>>= 1) ++ gs++; ++ for (n = 255 ; n > gvnc->fmt.blue_max ; n>>= 1) ++ bs++; + + for (y1 = 0; y1 < height; y1++) { + src_pixel_t *sp = (src_pixel_t *)src; +@@ -186,7 +211,7 @@ + | (COMPONENT(blue, *sp) << bs); + + if ((mp[x1 / 8] >> (7 - (x1 % 8))) & 1) +- *dst |= 0xFF000000; ++ *dst |= (0xFF << as); + + dst++; + sp++; +@@ -209,6 +234,11 @@ + uint8_t *sp = data; + + for (i = 0; i < width; i++) { ++ /* ++ * We use gvnc->fmt.XXX_shift instead of usual gvnc->Xls ++ * because the source pixel component is a full 8 bits in ++ * size, and so doesn't need the adjusted shift ++ */ + *dp = (((sp[0] * gvnc->fmt.red_max) / 255) << gvnc->fmt.red_shift) | + (((sp[1] * gvnc->fmt.green_max) / 255) << gvnc->fmt.green_shift) | + (((sp[2] * gvnc->fmt.blue_max) / 255) << gvnc->fmt.blue_shift); +Index: gtk-vnc/src/gvnc.c +=================================================================== +--- gtk-vnc.orig/src/gvnc.c 2008-03-17 18:47:43.000000000 +0100 ++++ gtk-vnc/src/gvnc.c 2008-03-25 17:24:08.000000000 +0100 +@@ -3023,18 +3023,6 @@ + gvnc->gls = gvnc->local.green_shift; + gvnc->bls = gvnc->local.blue_shift; + +- +- /* This adjusts for server/client endianness mismatch */ +- if (__BYTE_ORDER != gvnc->fmt.byte_order) { +- gvnc->rrs = gvnc->fmt.bits_per_pixel - gvnc->rrs - (gvnc->fmt.bits_per_pixel - gvnc->fmt.depth); +- gvnc->grs = gvnc->fmt.bits_per_pixel - gvnc->grs - (gvnc->fmt.bits_per_pixel - gvnc->fmt.depth); +- gvnc->brs = gvnc->fmt.bits_per_pixel - gvnc->brs - (gvnc->fmt.bits_per_pixel - gvnc->fmt.depth); +- +- GVNC_DEBUG("Flipped shifts red: %3d, green: %3d, blue: %3d\n", +- gvnc->rrs, gvnc->grs, gvnc->brs); +- } +- +- + /* This adjusts for remote having more bpp than local */ + for (n = gvnc->fmt.red_max; n > gvnc->local.red_mask ; n>>= 1) + gvnc->rrs++; +Index: gtk-vnc/src/vncdisplay.c +=================================================================== +--- gtk-vnc.orig/src/vncdisplay.c 2008-03-25 17:21:32.000000000 +0100 ++++ gtk-vnc/src/vncdisplay.c 2008-03-25 17:23:35.000000000 +0100 +@@ -750,9 +750,17 @@ + VncDisplayPrivate *priv = obj->priv; + GdkVisual *visual; + +- visual = gdk_drawable_get_visual(GTK_WIDGET(obj)->window); ++ visual = gdk_screen_get_system_visual(gdk_screen_get_default()); + + priv->image = gdk_image_new(GDK_IMAGE_FASTEST, visual, width, height); ++ GVNC_DEBUG("Visual mask: %3d %3d %3d\n shift: %3d %3d %3d\n", ++ visual->red_mask, ++ visual->green_mask, ++ visual->blue_mask, ++ visual->red_shift, ++ visual->green_shift, ++ visual->blue_shift); ++ + priv->fb.red_mask = visual->red_mask >> visual->red_shift; + priv->fb.green_mask = visual->green_mask >> visual->green_shift; + priv->fb.blue_mask = visual->blue_mask >> visual->blue_shift; only in patch2: unchanged: --- gtk-vnc-0.3.4.orig/debian/patches/from_upstream_fix_crash_on_closing_connection_lp_207205.patch +++ gtk-vnc-0.3.4/debian/patches/from_upstream_fix_crash_on_closing_connection_lp_207205.patch @@ -0,0 +1,65 @@ + +# HG changeset patch +# User Jonh Wendell +# Date 1208266506 10800 +# Node ID fb2b0584c87ef82942b9c8259444fca7916a8ea9 +# Parent 53a42c599c777196fd2bfbd58999e80ccb734805 +Fixed a crash when closing the connection in a middle of an update + +--- a/src/vncdisplay.c Fri Apr 11 09:15:48 2008 -0300 ++++ b/src/vncdisplay.c Tue Apr 15 10:35:06 2008 -0300 +@@ -1434,6 +1434,19 @@ static gboolean delayed_unref_object(gpo + VncDisplay *obj = VNC_DISPLAY(data); + + g_assert(obj->priv->coroutine.exited == TRUE); ++ ++ if (obj->priv->image) { ++ g_object_unref(obj->priv->image); ++ obj->priv->image = NULL; ++ } ++ ++#if WITH_GTKGLEXT ++ if (obj->priv->gl_tex_data) ++ g_free(obj->priv->gl_tex_data); ++ obj->priv->gl_tex_data = NULL; ++ obj->priv->gl_enabled = 0; ++#endif ++ + g_object_unref(G_OBJECT(data)); + return FALSE; + } +@@ -1608,20 +1621,12 @@ void vnc_display_close(VncDisplay *obj) + gvnc_shutdown(priv->gvnc); + } + +- if (priv->image) { +- g_object_unref(priv->image); +- priv->image = NULL; +- } +- + #if WITH_GTKGLEXT + if (priv->gl_tex_data) { + gdk_gl_drawable_gl_begin(priv->gl_drawable, + priv->gl_context); + glDeleteTextures(1, &priv->gl_tex); + gdk_gl_drawable_gl_end(priv->gl_drawable); +- g_free(priv->gl_tex_data); +- priv->gl_tex_data = NULL; +- priv->gl_enabled = 0; + } + #endif + +@@ -1719,8 +1724,10 @@ static void vnc_display_finalize (GObjec + priv->gl_context); + glDeleteTextures(1, &priv->gl_tex); + gdk_gl_drawable_gl_end(priv->gl_drawable); +- g_free(priv->gl_tex_data); +- priv->gl_tex_data = NULL; ++ if (priv->gl_tex_data) { ++ g_free(priv->gl_tex_data); ++ priv->gl_tex_data = NULL; ++ } + } + + if (priv->gl_config) { + only in patch2: unchanged: --- gtk-vnc-0.3.4.orig/debian/patches/from_upstream_fix_vinagre_connection_lp_206227.patch +++ gtk-vnc-0.3.4/debian/patches/from_upstream_fix_vinagre_connection_lp_206227.patch @@ -0,0 +1,106 @@ + +# HG changeset patch +# User Jonh Wendell +# Date 1209308262 10800 +# Node ID e1b964facd652594f5197aeb389f1f9ad68ad977 +# Parent adefa4c86b293acb59107834bbb0d024b4aa19ba +Implement preferable auth methods + +--- a/src/vncdisplay.c Thu Apr 24 11:48:00 2008 -0400 ++++ b/src/vncdisplay.c Sun Apr 27 11:57:42 2008 -0300 +@@ -81,6 +81,8 @@ struct _VncDisplayPrivate + gboolean read_only; + gboolean allow_lossy; + gboolean allow_scaling; ++ ++ GSList *preferable_auths; + }; + + /* Delayed signal emission. +@@ -1264,14 +1266,24 @@ static gboolean on_auth_type(void *opaqu + { + VncDisplay *obj = VNC_DISPLAY(opaque); + VncDisplayPrivate *priv = obj->priv; +- +- /* +- * XXX lame - we should have some prioritization. That +- * said most servers only support 1 auth type at any time +- */ +- if (ntype) +- gvnc_set_auth_type(priv->gvnc, types[0]); +- ++ GSList *l; ++ guint i; ++ ++ if (!ntype) ++ return TRUE; ++ ++ for (l = priv->preferable_auths; l; l=l->next) { ++ gvnc_auth pref = GPOINTER_TO_UINT (l->data); ++ ++ for (i=0; igvnc, types[i]); ++ return TRUE; ++ } ++ } ++ } ++ ++ gvnc_set_auth_type(priv->gvnc, types[0]); + return TRUE; + } + +@@ -1280,13 +1292,24 @@ static gboolean on_auth_subtype(void *op + VncDisplay *obj = VNC_DISPLAY(opaque); + VncDisplayPrivate *priv = obj->priv; + +- /* +- * XXX lame - we should have some prioritization. That +- * said most servers only support 1 auth type at any time +- */ +- if (ntype) +- gvnc_set_auth_subtype(priv->gvnc, types[0]); +- ++ GSList *l; ++ guint i; ++ ++ if (!ntype) ++ return TRUE; ++ ++ for (l = priv->preferable_auths; l; l=l->next) { ++ gvnc_auth pref = GPOINTER_TO_UINT (l->data); ++ ++ for (i=0; igvnc, types[i]); ++ return TRUE; ++ } ++ } ++ } ++ ++ gvnc_set_auth_subtype(priv->gvnc, types[0]); + return TRUE; + } + +@@ -1740,6 +1763,8 @@ static void vnc_display_finalize (GObjec + g_object_unref(priv->image); + priv->image = NULL; + } ++ ++ g_slist_free (priv->preferable_auths); + + G_OBJECT_CLASS (vnc_display_parent_class)->finalize (obj); + } +@@ -2071,6 +2096,11 @@ static void vnc_display_init(VncDisplay + priv->grab_keyboard = FALSE; + priv->local_pointer = FALSE; + ++ priv->preferable_auths = g_slist_append (priv->preferable_auths, GUINT_TO_POINTER (GVNC_AUTH_VENCRYPT)); ++ priv->preferable_auths = g_slist_append (priv->preferable_auths, GUINT_TO_POINTER (GVNC_AUTH_TLS)); ++ priv->preferable_auths = g_slist_append (priv->preferable_auths, GUINT_TO_POINTER (GVNC_AUTH_VNC)); ++ priv->preferable_auths = g_slist_append (priv->preferable_auths, GUINT_TO_POINTER (GVNC_AUTH_NONE)); ++ + #if WITH_GTKGLEXT + if (gtk_gl_init_check(NULL, NULL)) { + priv->gl_config = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB | +