[PATCH 19/25] Remove 'get_preferred_pixel_format' operation



Remove the 'get_preferred_pixel_format' operation callback, and
instead directly set the pixel format (if desired) during the
initialization phase of the coroutine
---
 src/vncconnection.c |   12 +----
 src/vncconnection.h |    1 -
 src/vncdisplay.c    |  124 +++++++++++++++++++++++++++++++--------------------
 3 files changed, 78 insertions(+), 59 deletions(-)

diff --git a/src/vncconnection.c b/src/vncconnection.c
index cd246b9..587c170 100644
--- a/src/vncconnection.c
+++ b/src/vncconnection.c
@@ -1219,8 +1219,7 @@ gboolean vnc_connection_set_pixel_format(VncConnection *conn,
 	vnc_connection_write(conn, pad, 3);
 	vnc_connection_flush(conn);
 
-	if (&priv->fmt != fmt)
-		memcpy(&priv->fmt, fmt, sizeof(*fmt));
+	memcpy(&priv->fmt, fmt, sizeof(*fmt));
 
 	return !vnc_connection_has_error(conn);
 }
@@ -4044,19 +4043,12 @@ gboolean vnc_connection_initialize(VncConnection *conn, gboolean shared_flag)
 	if (vnc_connection_has_error(conn))
 		return FALSE;
 
-	if (!priv->ops.get_preferred_pixel_format)
-		goto fail;
-	if (priv->ops.get_preferred_pixel_format(priv->ops_data, &priv->fmt))
-		vnc_connection_set_pixel_format(conn, &priv->fmt);
-	else
-		goto fail;
 	memset(&priv->strm, 0, sizeof(priv->strm));
 	/* FIXME what level? */
 	for (i = 0; i < 5; i++)
 		inflateInit(&priv->streams[i]);
 	priv->strm = NULL;
 
-	vnc_connection_resize(conn, priv->width, priv->height);
 	return !vnc_connection_has_error(conn);
 
  fail:
@@ -4341,6 +4333,8 @@ gboolean vnc_connection_set_framebuffer(VncConnection *conn, VncFramebuffer *fb)
 	const VncPixelFormat *remote;
 	int i;
 
+	GVNC_DEBUG("Set framebuffer %p", fb);
+
 	if (priv->fb)
 		g_object_unref(G_OBJECT(priv->fb));
 	priv->fb = fb;
diff --git a/src/vncconnection.h b/src/vncconnection.h
index c1f7711..bd8532f 100644
--- a/src/vncconnection.h
+++ b/src/vncconnection.h
@@ -73,7 +73,6 @@ struct vnc_connection_ops
 	gboolean (*set_color_map_entry)(void *, int, int, int, int);
 	gboolean (*render_jpeg)(void *, rgb24_render_func *render, void *,
 				int, int, int, int, guint8 *, int);
-	gboolean (*get_preferred_pixel_format)(void *, VncPixelFormat *);
 };
 
 
diff --git a/src/vncdisplay.c b/src/vncdisplay.c
index 05d458c..0d46119 100644
--- a/src/vncdisplay.c
+++ b/src/vncdisplay.c
@@ -990,71 +990,89 @@ static void on_pixel_format_changed(VncConnection *conn G_GNUC_UNUSED,
 	do_framebuffer_init(opaque, remoteFormat, width, height, TRUE);
 }
 
-static gboolean on_get_preferred_pixel_format(void *opaque,
-					      VncPixelFormat *fmt)
+static gboolean vnc_display_set_preferred_pixel_format(VncDisplay *display)
 {
-	VncDisplay *obj = VNC_DISPLAY(opaque);
-	GdkVisual *v =  gdk_drawable_get_visual(GTK_WIDGET(obj)->window);
+	VncDisplayPrivate *priv = display->priv;
+	GdkVisual *v =  gdk_drawable_get_visual(GTK_WIDGET(display)->window);
+	VncPixelFormat fmt;
+	const VncPixelFormat *currentFormat;
+
+	memset(&fmt, 0, sizeof(fmt));
+
+	/* Get current pixel format for server */
+	currentFormat = vnc_connection_get_pixel_format(priv->conn);
 
-	switch (obj->priv->depth) {
+	switch (priv->depth) {
 	case VNC_DISPLAY_DEPTH_COLOR_DEFAULT:
-		if (fmt->true_color_flag == 1)
-			break;
+		/* If current format is not true colour, then
+		 * fallthrough to next case
+		 */
+		if (currentFormat->true_color_flag == 1) {
+			GVNC_DEBUG ("Using default colour depth %d (%d bpp)",
+				    currentFormat->depth, currentFormat->bits_per_pixel);
+			return TRUE;
+		}
+
 	case VNC_DISPLAY_DEPTH_COLOR_FULL:
-		fmt->depth = 24;
-		fmt->bits_per_pixel = 32;
-		fmt->red_max = 255;
-		fmt->green_max = 255;
-		fmt->blue_max = 255;
-		fmt->red_shift = 16;
-		fmt->green_shift = 8;
-		fmt->blue_shift = 0;
-		fmt->true_color_flag = 1;
-		fmt->byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
+		fmt.depth = 24;
+		fmt.bits_per_pixel = 32;
+		fmt.red_max = 255;
+		fmt.green_max = 255;
+		fmt.blue_max = 255;
+		fmt.red_shift = 16;
+		fmt.green_shift = 8;
+		fmt.blue_shift = 0;
+		fmt.true_color_flag = 1;
+		fmt.byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
 		break;
+
 	case VNC_DISPLAY_DEPTH_COLOR_MEDIUM:
-		fmt->depth = 15;
-		fmt->bits_per_pixel = 16;
-		fmt->red_max = 31;
-		fmt->green_max = 31;
-		fmt->blue_max = 31;
-		fmt->red_shift = 11;
-		fmt->green_shift = 6;
-		fmt->blue_shift = 1;
-		fmt->true_color_flag = 1;
-		fmt->byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
+		fmt.depth = 15;
+		fmt.bits_per_pixel = 16;
+		fmt.red_max = 31;
+		fmt.green_max = 31;
+		fmt.blue_max = 31;
+		fmt.red_shift = 11;
+		fmt.green_shift = 6;
+		fmt.blue_shift = 1;
+		fmt.true_color_flag = 1;
+		fmt.byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
 		break;
+
 	case VNC_DISPLAY_DEPTH_COLOR_LOW:
-		fmt->depth = 8;
-		fmt->bits_per_pixel = 8;
-		fmt->red_max = 7;
-		fmt->green_max = 7;
-		fmt->blue_max = 3;
-		fmt->red_shift = 5;
-		fmt->green_shift = 2;
-		fmt->blue_shift = 0;
-		fmt->true_color_flag = 1;
-		fmt->byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
+		fmt.depth = 8;
+		fmt.bits_per_pixel = 8;
+		fmt.red_max = 7;
+		fmt.green_max = 7;
+		fmt.blue_max = 3;
+		fmt.red_shift = 5;
+		fmt.green_shift = 2;
+		fmt.blue_shift = 0;
+		fmt.true_color_flag = 1;
+		fmt.byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
 		break;
 
 	case VNC_DISPLAY_DEPTH_COLOR_ULTRA_LOW:
-		fmt->depth = 3;
-		fmt->bits_per_pixel = 8;
-		fmt->red_max = 1;
-		fmt->green_max = 1;
-		fmt->blue_max = 1;
-		fmt->red_shift = 7;
-		fmt->green_shift = 6;
-		fmt->blue_shift = 5;
-		fmt->true_color_flag = 1;
-		fmt->byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
+		fmt.depth = 3;
+		fmt.bits_per_pixel = 8;
+		fmt.red_max = 1;
+		fmt.green_max = 1;
+		fmt.blue_max = 1;
+		fmt.red_shift = 7;
+		fmt.green_shift = 6;
+		fmt.blue_shift = 5;
+		fmt.true_color_flag = 1;
+		fmt.byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
 		break;
 
 	default:
 		g_assert_not_reached ();
 	}
 
-	GVNC_DEBUG ("Setting depth color to %d (%d bpp)", fmt->depth, fmt->bits_per_pixel);
+	GVNC_DEBUG ("Set depth color to %d (%d bpp)", fmt.depth, fmt.bits_per_pixel);
+	if (!vnc_connection_set_pixel_format(priv->conn, &fmt))
+		return FALSE;
+
 	return TRUE;
 }
 
@@ -1296,7 +1314,6 @@ static const struct vnc_connection_ops vnc_display_ops = {
 	.auth_type = on_auth_type,
 	.auth_subtype = on_auth_subtype,
 	.render_jpeg = on_render_jpeg,
-	.get_preferred_pixel_format = on_get_preferred_pixel_format
 };
 
 /* we use an idle function to allow the coroutine to exit before we actually
@@ -1369,6 +1386,15 @@ static void *vnc_coroutine(void *opaque)
 	if (!vnc_connection_initialize(priv->conn, priv->shared_flag))
 		goto cleanup;
 
+	if (!vnc_display_set_preferred_pixel_format(obj))
+		goto cleanup;
+
+	do_framebuffer_init(obj,
+			    vnc_connection_get_pixel_format(priv->conn),
+			    vnc_connection_get_width(priv->conn),
+			    vnc_connection_get_height(priv->conn),
+			    FALSE);
+
 	emit_signal_delayed(obj, VNC_INITIALIZED, &s);
 
 	encodingsp = encodings;
-- 
1.6.5.2



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]