Update to 0.2.0 release

This commit is contained in:
Daniel P. Berrange 2007-09-14 04:30:57 +00:00
parent 02c20b1e4c
commit 716b46ebb5
7 changed files with 7 additions and 441 deletions

View File

@ -1,3 +1,3 @@
gtk-vnc-0.1.0.tar.gz
*.src.rpm *.src.rpm
.*.log .*.log
gtk-vnc-0.2.0.tar.gz

View File

@ -1,51 +0,0 @@
changeset: 54:b1c48ddc01d9
tag: tip
user: "Daniel P. Berrange <berrange@redhat.com>"
date: Wed Aug 22 15:10:12 2007 -0400
files: src/vncdisplay.c
description:
Clear excess space in widget
diff -r f6b6e9e2ac43 -r b1c48ddc01d9 src/vncdisplay.c
--- a/src/vncdisplay.c Wed Aug 22 15:09:58 2007 -0400
+++ b/src/vncdisplay.c Wed Aug 22 15:10:12 2007 -0400
@@ -103,6 +103,8 @@ static gboolean expose_event(GtkWidget *
VncDisplay *obj = VNC_DISPLAY(widget);
VncDisplayPrivate *priv = obj->priv;
int x, y, w, h;
+ GdkRectangle drawn;
+ GdkRegion *clear, *copy;
if (priv->shm_image == NULL)
return TRUE;
@@ -114,9 +116,27 @@ static gboolean expose_event(GtkWidget *
w -= x;
h -= y;
+ drawn.x = x;
+ drawn.y = y;
+ drawn.width = w;
+ drawn.height = h;
+
+ clear = gdk_region_rectangle(&expose->area);
+ copy = gdk_region_rectangle(&drawn);
+ gdk_region_subtract(clear, copy);
+
+ gdk_gc_set_clip_region(priv->gc, copy);
vnc_shm_image_draw(priv->shm_image, widget->window,
- priv->gc,
+ priv->gc,
x, y, x, y, w, h);
+
+ gdk_gc_set_clip_region(priv->gc, clear);
+ gdk_draw_rectangle(widget->window, priv->gc, TRUE, expose->area.x, expose->area.y,
+ expose->area.width, expose->area.height);
+
+ gdk_region_destroy(clear);
+ gdk_region_destroy(copy);
+
return TRUE;
}

View File

@ -1,226 +0,0 @@
changeset: 55:ccee737658e4
tag: tip
user: "Daniel P. Berrange <berrange@redhat.com>"
date: Fri Aug 24 17:19:37 2007 -0400
files: src/blt.h src/gvnc.c src/gvnc.h src/vncdisplay.c
description:
Fixed adjustment for mis-matched colour depths local vs remote
diff -r b1c48ddc01d9 -r ccee737658e4 src/blt.h
--- a/src/blt.h Wed Aug 22 15:10:12 2007 -0400
+++ b/src/blt.h Fri Aug 24 17:19:37 2007 -0400
@@ -32,7 +32,6 @@ static void FILL(struct gvnc *gvnc, src_
int x, int y, int width, int height)
{
uint8_t *dst = gvnc_get_local(gvnc, x, y);
- struct gvnc_pixel_format *f = &gvnc->fmt;
int i;
for (i = 0; i < 1; i++) {
@@ -40,9 +39,9 @@ static void FILL(struct gvnc *gvnc, src_
int j;
for (j = 0; j < width; j++) {
- *dp = ((*sp >> f->red_shift) & gvnc->rm) << gvnc->local.red_shift
- | ((*sp >> f->green_shift) & gvnc->gm) << gvnc->local.green_shift
- | ((*sp >> f->blue_shift) & gvnc->bm) << gvnc->local.blue_shift;
+ *dp = (((uint32_t)*sp >> gvnc->rrs) & gvnc->rm) << gvnc->rls
+ | (((uint32_t)*sp >> gvnc->grs) & gvnc->gm) << gvnc->gls
+ | (((uint32_t)*sp >> gvnc->brs) & gvnc->bm) << gvnc->bls;
dp++;
}
dst += gvnc->local.linesize;
@@ -56,7 +55,6 @@ static void BLIT(struct gvnc *gvnc, uint
static void BLIT(struct gvnc *gvnc, uint8_t *src, int pitch, int x, int y, int w, int h)
{
uint8_t *dst = gvnc_get_local(gvnc, x, y);
- struct gvnc_pixel_format *f = &gvnc->fmt;
int i;
for (i = 0; i < h; i++) {
@@ -65,9 +63,9 @@ static void BLIT(struct gvnc *gvnc, uint
int j;
for (j = 0; j < w; j++) {
- *dp = ((*sp >> f->red_shift) & gvnc->rm) << gvnc->local.red_shift
- | ((*sp >> f->green_shift) & gvnc->gm) << gvnc->local.green_shift
- | ((*sp >> f->blue_shift) & gvnc->bm) << gvnc->local.blue_shift;
+ *dp = (((uint32_t)*sp >> gvnc->rrs) & gvnc->rm) << gvnc->rls
+ | (((uint32_t)*sp >> gvnc->grs) & gvnc->gm) << gvnc->gls
+ | (((uint32_t)*sp >> gvnc->brs) & gvnc->bm) << gvnc->bls;
dp++;
sp++;
}
@@ -146,3 +144,12 @@ static void SUBRECT(struct gvnc *gvnc, u
#undef BLIT
#undef dst_pixel_t
#undef src_pixel_t
+
+
+/*
+ * Local variables:
+ * c-indent-level: 8
+ * c-basic-offset: 8
+ * tab-width: 8
+ * End:
+ */
diff -r b1c48ddc01d9 -r ccee737658e4 src/gvnc.c
--- a/src/gvnc.c Wed Aug 22 15:10:12 2007 -0400
+++ b/src/gvnc.c Fri Aug 24 17:19:37 2007 -0400
@@ -104,6 +104,8 @@ struct gvnc
struct gvnc_framebuffer local;
int rm, gm, bm;
+ int rrs, grs, brs;
+ int rls, gls, bls;
gvnc_blt_func *blt;
gvnc_hextile_func *hextile;
@@ -673,7 +675,7 @@ static void gvnc_read_pixel_format(struc
fmt->bits_per_pixel = gvnc_read_u8(gvnc);
fmt->depth = gvnc_read_u8(gvnc);
- fmt->big_endian_flag = gvnc_read_u8(gvnc);
+ fmt->byte_order = gvnc_read_u8(gvnc) ? __BIG_ENDIAN : __LITTLE_ENDIAN;
fmt->true_color_flag = gvnc_read_u8(gvnc);
fmt->red_max = gvnc_read_u16(gvnc);
@@ -686,23 +688,12 @@ static void gvnc_read_pixel_format(struc
gvnc_read(gvnc, pad, 3);
- GVNC_DEBUG("Pixel format BPP: %d, Depth: %d, Endian: %d, True color: %d\n"
+ GVNC_DEBUG("Pixel format BPP: %d, Depth: %d, Byte order: %d, True color: %d\n"
" Mask red: %3d, green: %3d, blue: %3d\n"
" Shift red: %3d, green: %3d, blue: %3d\n",
- fmt->bits_per_pixel, fmt->depth, fmt->big_endian_flag, fmt->true_color_flag,
+ fmt->bits_per_pixel, fmt->depth, fmt->byte_order, fmt->true_color_flag,
fmt->red_max, fmt->green_max, fmt->blue_max,
fmt->red_shift, fmt->green_shift, fmt->blue_shift);
-
-
- if (((__BYTE_ORDER == __BIG_ENDIAN) && !fmt->big_endian_flag) ||
- ((__BYTE_ORDER == __LITTLE_ENDIAN) && fmt->big_endian_flag)) {
- fmt->red_shift = fmt->bits_per_pixel - fmt->red_shift - (fmt->bits_per_pixel - fmt->depth);
- fmt->green_shift = fmt->bits_per_pixel - fmt->green_shift - (fmt->bits_per_pixel - fmt->depth);
- fmt->blue_shift = fmt->bits_per_pixel - fmt->blue_shift - (fmt->bits_per_pixel - fmt->depth);
-
- GVNC_DEBUG("Flipped shifts Shift red: %3d, green: %3d, blue: %3d\n",
- fmt->red_shift, fmt->green_shift, fmt->blue_shift);
- }
}
/* initialize function */
@@ -722,7 +713,7 @@ gboolean gvnc_set_pixel_format(struct gv
gvnc_write_u8(gvnc, fmt->bits_per_pixel);
gvnc_write_u8(gvnc, fmt->depth);
- gvnc_write_u8(gvnc, fmt->big_endian_flag);
+ gvnc_write_u8(gvnc, fmt->byte_order == __BIG_ENDIAN ? 1 : 0);
gvnc_write_u8(gvnc, fmt->true_color_flag);
gvnc_write_u16(gvnc, fmt->red_max);
@@ -1985,7 +1976,7 @@ gboolean gvnc_set_credential_x509_cert(s
gboolean gvnc_set_local(struct gvnc *gvnc, struct gvnc_framebuffer *fb)
{
- int i, j;
+ int i, j, n;
int depth;
memcpy(&gvnc->local, fb, sizeof(*fb));
@@ -1997,8 +1988,7 @@ gboolean gvnc_set_local(struct gvnc *gvn
fb->red_shift == gvnc->fmt.red_shift &&
fb->green_shift == gvnc->fmt.green_shift &&
fb->blue_shift == gvnc->fmt.blue_shift &&
- ((gvnc->fmt.big_endian_flag && (__BYTE_ORDER == __BIG_ENDIAN)) ||
- (!gvnc->fmt.big_endian_flag && (__BYTE_ORDER == __LITTLE_ENDIAN))))
+ __BYTE_ORDER == gvnc->fmt.byte_order)
gvnc->perfect_match = TRUE;
else
gvnc->perfect_match = FALSE;
@@ -2016,6 +2006,47 @@ gboolean gvnc_set_local(struct gvnc *gvn
gvnc->local.red_mask, gvnc->local.green_mask, gvnc->local.blue_mask,
gvnc->fmt.red_max, gvnc->fmt.green_max, gvnc->fmt.blue_max,
gvnc->rm, gvnc->gm, gvnc->bm);
+
+ /* Setup shifts assuming matched bpp (but not neccessarily match rgb order)*/
+ gvnc->rrs = gvnc->fmt.red_shift;
+ gvnc->grs = gvnc->fmt.green_shift;
+ gvnc->brs = gvnc->fmt.blue_shift;
+
+ gvnc->rls = gvnc->local.red_shift;
+ 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++;
+ for (n = gvnc->fmt.green_max; n > gvnc->local.green_mask ; n>>= 1)
+ gvnc->grs++;
+ for (n = gvnc->fmt.blue_max; n > gvnc->local.blue_mask ; n>>= 1)
+ gvnc->brs++;
+
+ /* This adjusts for remote having less bpp than remote */
+ for (n = gvnc->local.red_mask ; n > gvnc->fmt.red_max ; n>>= 1)
+ gvnc->rls++;
+ for (n = gvnc->local.green_mask ; n > gvnc->fmt.green_max ; n>>= 1)
+ gvnc->gls++;
+ for (n = gvnc->local.blue_mask ; n > gvnc->fmt.blue_max ; n>>= 1)
+ gvnc->bls++;
+ GVNC_DEBUG("Pixel shifts\n right: %3d %3d %3d\n left: %3d %3d %3d\n",
+ gvnc->rrs, gvnc->grs, gvnc->brs,
+ gvnc->rls, gvnc->gls, gvnc->bls);
+
i = gvnc->fmt.bits_per_pixel / 8;
j = gvnc->local.bpp;
diff -r b1c48ddc01d9 -r ccee737658e4 src/gvnc.h
--- a/src/gvnc.h Wed Aug 22 15:10:12 2007 -0400
+++ b/src/gvnc.h Fri Aug 24 17:19:37 2007 -0400
@@ -24,7 +24,7 @@ struct gvnc_pixel_format
{
uint8_t bits_per_pixel;
uint8_t depth;
- uint8_t big_endian_flag;
+ uint16_t byte_order;
uint8_t true_color_flag;
uint16_t red_max;
uint16_t green_max;
diff -r b1c48ddc01d9 -r ccee737658e4 src/vncdisplay.c
--- a/src/vncdisplay.c Wed Aug 22 15:10:12 2007 -0400
+++ b/src/vncdisplay.c Fri Aug 24 17:19:37 2007 -0400
@@ -426,7 +426,6 @@ static gboolean on_resize(void *opaque,
VncDisplay *obj = VNC_DISPLAY(opaque);
VncDisplayPrivate *priv = obj->priv;
GdkVisual *visual;
- int depth;
if (priv->gvnc == NULL || !gvnc_is_initialized(priv->gvnc))
return TRUE;
@@ -446,9 +445,8 @@ static gboolean on_resize(void *opaque,
priv->gc = gdk_gc_new(GTK_WIDGET(obj)->window);
}
- depth = gdk_drawable_get_depth(GTK_WIDGET(obj)->window);
- visual = gdk_visual_get_best_with_depth(depth);
-
+ visual = gdk_drawable_get_visual(GTK_WIDGET(obj)->window);
+
priv->shm_image = vnc_shm_image_new(visual, width, height, priv->use_shm);
priv->fb.shm_id = priv->shm_image->shmid;

View File

@ -1,131 +0,0 @@
changeset: 53:f6b6e9e2ac43
user: "Daniel P. Berrange <berrange@redhat.com>"
date: Wed Aug 22 15:09:58 2007 -0400
files: src/blt.h src/gvnc.c
description:
Fixed handling of shifts for BGR displays and mixed endian client vs server
diff -r 453f9ca2a737 -r f6b6e9e2ac43 src/blt.h
--- a/src/blt.h Wed Aug 22 10:40:33 2007 -0400
+++ b/src/blt.h Wed Aug 22 15:09:58 2007 -0400
@@ -40,9 +40,9 @@ static void FILL(struct gvnc *gvnc, src_
int j;
for (j = 0; j < width; j++) {
- *dp = ((*sp >> f->red_shift) & gvnc->rm) << gvnc->rp
- | ((*sp >> f->green_shift) & gvnc->gm) << gvnc->gp
- | ((*sp >> f->blue_shift) & gvnc->bm) << gvnc->bp;
+ *dp = ((*sp >> f->red_shift) & gvnc->rm) << gvnc->local.red_shift
+ | ((*sp >> f->green_shift) & gvnc->gm) << gvnc->local.green_shift
+ | ((*sp >> f->blue_shift) & gvnc->bm) << gvnc->local.blue_shift;
dp++;
}
dst += gvnc->local.linesize;
@@ -65,9 +65,9 @@ static void BLIT(struct gvnc *gvnc, uint
int j;
for (j = 0; j < w; j++) {
- *dp = ((*sp >> f->red_shift) & gvnc->rm) << gvnc->rp
- | ((*sp >> f->green_shift) & gvnc->gm) << gvnc->gp
- | ((*sp >> f->blue_shift) & gvnc->bm) << gvnc->bp;
+ *dp = ((*sp >> f->red_shift) & gvnc->rm) << gvnc->local.red_shift
+ | ((*sp >> f->green_shift) & gvnc->gm) << gvnc->local.green_shift
+ | ((*sp >> f->blue_shift) & gvnc->bm) << gvnc->local.blue_shift;
dp++;
sp++;
}
diff -r 453f9ca2a737 -r f6b6e9e2ac43 src/gvnc.c
--- a/src/gvnc.c Wed Aug 22 10:40:33 2007 -0400
+++ b/src/gvnc.c Wed Aug 22 15:09:58 2007 -0400
@@ -26,6 +26,7 @@
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <endian.h>
#include "coroutine.h"
#include "d3des.h"
@@ -102,7 +103,6 @@ struct gvnc
gboolean perfect_match;
struct gvnc_framebuffer local;
- int rp, gp, bp;
int rm, gm, bm;
gvnc_blt_func *blt;
@@ -676,9 +676,6 @@ static void gvnc_read_pixel_format(struc
fmt->big_endian_flag = gvnc_read_u8(gvnc);
fmt->true_color_flag = gvnc_read_u8(gvnc);
- GVNC_DEBUG("Pixel format BPP: %d, Depth: %d, Endian: %d, True color: %d\n",
- fmt->bits_per_pixel, fmt->depth, fmt->big_endian_flag, fmt->true_color_flag);
-
fmt->red_max = gvnc_read_u16(gvnc);
fmt->green_max = gvnc_read_u16(gvnc);
fmt->blue_max = gvnc_read_u16(gvnc);
@@ -688,6 +685,24 @@ static void gvnc_read_pixel_format(struc
fmt->blue_shift = gvnc_read_u8(gvnc);
gvnc_read(gvnc, pad, 3);
+
+ GVNC_DEBUG("Pixel format BPP: %d, Depth: %d, Endian: %d, True color: %d\n"
+ " Mask red: %3d, green: %3d, blue: %3d\n"
+ " Shift red: %3d, green: %3d, blue: %3d\n",
+ fmt->bits_per_pixel, fmt->depth, fmt->big_endian_flag, fmt->true_color_flag,
+ fmt->red_max, fmt->green_max, fmt->blue_max,
+ fmt->red_shift, fmt->green_shift, fmt->blue_shift);
+
+
+ if (((__BYTE_ORDER == __BIG_ENDIAN) && !fmt->big_endian_flag) ||
+ ((__BYTE_ORDER == __LITTLE_ENDIAN) && fmt->big_endian_flag)) {
+ fmt->red_shift = fmt->bits_per_pixel - fmt->red_shift - (fmt->bits_per_pixel - fmt->depth);
+ fmt->green_shift = fmt->bits_per_pixel - fmt->green_shift - (fmt->bits_per_pixel - fmt->depth);
+ fmt->blue_shift = fmt->bits_per_pixel - fmt->blue_shift - (fmt->bits_per_pixel - fmt->depth);
+
+ GVNC_DEBUG("Flipped shifts Shift red: %3d, green: %3d, blue: %3d\n",
+ fmt->red_shift, fmt->green_shift, fmt->blue_shift);
+ }
}
/* initialize function */
@@ -1981,7 +1996,9 @@ gboolean gvnc_set_local(struct gvnc *gvn
fb->blue_mask == gvnc->fmt.blue_max &&
fb->red_shift == gvnc->fmt.red_shift &&
fb->green_shift == gvnc->fmt.green_shift &&
- fb->blue_shift == gvnc->fmt.blue_shift)
+ fb->blue_shift == gvnc->fmt.blue_shift &&
+ ((gvnc->fmt.big_endian_flag && (__BYTE_ORDER == __BIG_ENDIAN)) ||
+ (!gvnc->fmt.big_endian_flag && (__BYTE_ORDER == __LITTLE_ENDIAN))))
gvnc->perfect_match = TRUE;
else
gvnc->perfect_match = FALSE;
@@ -1990,21 +2007,15 @@ gboolean gvnc_set_local(struct gvnc *gvn
if (depth == 32)
depth = 24;
- gvnc->rp = (gvnc->local.depth - gvnc->local.red_shift);
- gvnc->rp -= (depth - gvnc->fmt.red_shift);
- gvnc->gp = (gvnc->local.red_shift - gvnc->local.green_shift);
- gvnc->gp -= (gvnc->fmt.red_shift - gvnc->fmt.green_shift);
- gvnc->bp = (gvnc->local.green_shift - gvnc->local.blue_shift);
- gvnc->bp -= (gvnc->fmt.green_shift - gvnc->fmt.blue_shift);
-
- gvnc->rp = gvnc->local.red_shift + gvnc->rp;
- gvnc->gp = gvnc->local.green_shift + gvnc->gp;
- gvnc->bp = gvnc->local.blue_shift + gvnc->bp;
-
gvnc->rm = gvnc->local.red_mask & gvnc->fmt.red_max;
gvnc->gm = gvnc->local.green_mask & gvnc->fmt.green_max;
gvnc->bm = gvnc->local.blue_mask & gvnc->fmt.blue_max;
-
+ GVNC_DEBUG("Mask local: %3d %3d %3d\n"
+ " remote: %3d %3d %3d\n"
+ " merged: %3d %3d %3d\n",
+ gvnc->local.red_mask, gvnc->local.green_mask, gvnc->local.blue_mask,
+ gvnc->fmt.red_max, gvnc->fmt.green_max, gvnc->fmt.blue_max,
+ gvnc->rm, gvnc->gm, gvnc->bm);
i = gvnc->fmt.bits_per_pixel / 8;
j = gvnc->local.bpp;

View File

@ -1,21 +0,0 @@
changeset: 51:a4bd9ecc4e4e
user: "Daniel P. Berrange <berrange@redhat.com>"
date: Wed Aug 22 10:35:47 2007 -0400
files: examples/gvncviewer.py
description:
Fix offf by one in argv use
diff -r 860bcf129876 -r a4bd9ecc4e4e examples/gvncviewer.py
--- a/examples/gvncviewer.py Wed Aug 15 17:45:56 2007 -0400
+++ b/examples/gvncviewer.py Wed Aug 22 10:35:47 2007 -0400
@@ -153,7 +153,7 @@ vnc.set_keyboard_grab(True)
#v.set_pointer_local(True)
if len(sys.argv) == 3:
- vnc.set_credential(gtkvnc.CREDENTIAL_PASSWORD, sys.argv[3])
+ vnc.set_credential(gtkvnc.CREDENTIAL_PASSWORD, sys.argv[2])
disp = sys.argv[1].find(":")
if disp != -1:

View File

@ -2,15 +2,11 @@
Summary: A GTK widget for VNC clients Summary: A GTK widget for VNC clients
Name: gtk-vnc Name: gtk-vnc
Version: 0.1.0 Version: 0.2.0
Release: 5%{?dist} Release: 1%{?dist}
License: LGPLv2+ License: LGPLv2+
Group: Development/Libraries Group: Development/Libraries
Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
Patch1: %{name}-%{version}-clear-area.patch
Patch2: %{name}-%{version}-endian-bgr.patch
Patch3: %{name}-%{version}-python-demo.patch
Patch4: %{name}-%{version}-colour-depth.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
URL: http://gtk-vnc.sf.net/ URL: http://gtk-vnc.sf.net/
BuildRequires: gtk2-devel pygtk2-devel python-devel gnutls-devel BuildRequires: gtk2-devel pygtk2-devel python-devel gnutls-devel
@ -45,10 +41,6 @@ A module allowing use of the GTK-VNC widget from python
%prep %prep
%setup -q %setup -q
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%build %build
%configure %configure
@ -88,6 +80,9 @@ rm -fr %{buildroot}
%{_libdir}/python*/site-packages/gtkvnc.so %{_libdir}/python*/site-packages/gtkvnc.so
%changelog %changelog
* Thu Sep 13 2007 Daniel P. Berrange <berrange@redhat.com> - 0.2.0-1.fc8
- Update to 0.2.0 release
* Wed Aug 29 2007 Daniel P. Berrange <berrange@redhat.com> - 0.1.0-5.fc8 * Wed Aug 29 2007 Daniel P. Berrange <berrange@redhat.com> - 0.1.0-5.fc8
- Fixed handling of mis-matched client/server colour depths - Fixed handling of mis-matched client/server colour depths

View File

@ -1 +1 @@
f0781695819bd00d5ba160205723a3b4 gtk-vnc-0.1.0.tar.gz b1321a9e88e5309f09c4f727f5a367e6 gtk-vnc-0.2.0.tar.gz