[gtk-vnc/encoding: 4/4] Added [gs]et_encoding to VncDisplay.



commit d0c27fd4a68a13cda2235e5ca9c2ca848fae893b
Author: Jonh Wendell <jwendell gnome org>
Date:   Mon Aug 31 17:13:48 2009 -0300

    Added [gs]et_encoding to VncDisplay.
    
    This allows applications to tell which behavior they prefer: Speed
    over quality and vice-versa.

 src/vncdisplay.c |  119 +++++++++++++++++++++++++++++++++++++++---------------
 src/vncdisplay.h |   10 +++++
 2 files changed, 96 insertions(+), 33 deletions(-)
---
diff --git a/src/vncdisplay.c b/src/vncdisplay.c
index af59e2a..8e73c07 100644
--- a/src/vncdisplay.c
+++ b/src/vncdisplay.c
@@ -92,6 +92,7 @@ struct _VncDisplayPrivate
 	gboolean force_size;
 
 	GSList *preferable_auths;
+	VncDisplayEncoding encoding;
 };
 
 /* Delayed signal emission.
@@ -132,7 +133,8 @@ enum
   PROP_LOSSY_ENCODING,
   PROP_SCALING,
   PROP_SHARED_FLAG,
-  PROP_FORCE_SIZE
+  PROP_FORCE_SIZE,
+  PROP_ENCODING
 };
 
 /* Signals */
@@ -206,6 +208,9 @@ vnc_display_get_property (GObject    *object,
       case PROP_LOSSY_ENCODING:
         g_value_set_boolean (value, vnc->priv->allow_lossy);
 	break;
+      case PROP_ENCODING:
+        g_value_set_enum (value, vnc->priv->encoding);
+	break;
       case PROP_SCALING:
         g_value_set_boolean (value, vnc->priv->allow_scaling);
 	break;
@@ -246,6 +251,9 @@ vnc_display_set_property (GObject      *object,
       case PROP_LOSSY_ENCODING:
         vnc_display_set_lossy_encoding (vnc, g_value_get_boolean (value));
         break;
+      case PROP_ENCODING:
+        vnc_display_set_encoding (vnc, g_value_get_enum (value));
+        break;
       case PROP_SCALING:
         vnc_display_set_scaling (vnc, g_value_get_boolean (value));
         break;
@@ -1304,27 +1312,53 @@ static gboolean delayed_unref_object(gpointer data)
 	return FALSE;
 }
 
+#define MAX_ENCODINGS 15
+static gboolean vnc_display_send_encodings(VncDisplay *obj)
+{
+	int32_t encodings[MAX_ENCODINGS];
+	int n_encodings = 0;
+
+	switch (obj->priv->encoding) {
+	case VNC_DISPLAY_ENCODING_AUTO:
+	case VNC_DISPLAY_ENCODING_SPEED:
+		if (check_pixbuf_support("jpeg")) {
+			if (obj->priv->allow_lossy)
+				encodings[n_encodings++] = GVNC_ENCODING_TIGHT_JPEG5;
+			encodings[n_encodings++] = GVNC_ENCODING_TIGHT;
+		}
+		encodings[n_encodings++] = GVNC_ENCODING_ZRLE;
+		encodings[n_encodings++] = GVNC_ENCODING_HEXTILE;
+		encodings[n_encodings++] = GVNC_ENCODING_RRE;
+		encodings[n_encodings++] = GVNC_ENCODING_COPY_RECT;
+		encodings[n_encodings++] = GVNC_ENCODING_RAW;
+		break;
+
+	case VNC_DISPLAY_ENCODING_QUALITY:
+		encodings[n_encodings++] = GVNC_ENCODING_HEXTILE;
+		encodings[n_encodings++] = GVNC_ENCODING_COPY_RECT;
+		encodings[n_encodings++] = GVNC_ENCODING_RRE;
+		encodings[n_encodings++] = GVNC_ENCODING_RAW;
+		break;
+
+	default:
+		g_assert_not_reached();
+	}
+
+	encodings[n_encodings++] = GVNC_ENCODING_EXT_KEY_EVENT;
+	encodings[n_encodings++] = GVNC_ENCODING_DESKTOP_RESIZE;
+	encodings[n_encodings++] = GVNC_ENCODING_WMVi;
+	encodings[n_encodings++] = GVNC_ENCODING_RICH_CURSOR;
+	encodings[n_encodings++] = GVNC_ENCODING_XCURSOR;
+	encodings[n_encodings++] = GVNC_ENCODING_POINTER_CHANGE;
+
+	return gvnc_set_encodings(obj->priv->gvnc, n_encodings, encodings);
+}
+#undef MAX_ENCODINGS
+
 static void *vnc_coroutine(void *opaque)
 {
 	VncDisplay *obj = VNC_DISPLAY(opaque);
 	VncDisplayPrivate *priv = obj->priv;
-
-	/* this order is extremely important! */
-	int32_t encodings[] = {	GVNC_ENCODING_TIGHT_JPEG5,
-				GVNC_ENCODING_TIGHT,
-				GVNC_ENCODING_EXT_KEY_EVENT,
-				GVNC_ENCODING_DESKTOP_RESIZE,
-                                GVNC_ENCODING_WMVi,
-				GVNC_ENCODING_RICH_CURSOR,
-				GVNC_ENCODING_XCURSOR,
-				GVNC_ENCODING_POINTER_CHANGE,
-				GVNC_ENCODING_ZRLE,
-				GVNC_ENCODING_HEXTILE,
-				GVNC_ENCODING_RRE,
-				GVNC_ENCODING_COPY_RECT,
-				GVNC_ENCODING_RAW };
-	int32_t *encodingsp;
-	int n_encodings;
 	int ret;
 	struct signal_data s;
 
@@ -1352,21 +1386,8 @@ static void *vnc_coroutine(void *opaque)
 
 	emit_signal_delayed(obj, VNC_INITIALIZED, &s);
 
-	encodingsp = encodings;
-	n_encodings = G_N_ELEMENTS(encodings);
-
-	if (check_pixbuf_support("jpeg")) {
-		if (!priv->allow_lossy) {
-			encodingsp++;
-			n_encodings--;
-		}
-	} else {
-		encodingsp += 2;
-		n_encodings -= 2;
-	}
-
-	if (!gvnc_set_encodings(priv->gvnc, n_encodings, encodingsp))
-			goto cleanup;
+	if (!vnc_display_send_encodings (obj))
+		goto cleanup;
 
 	if (!gvnc_framebuffer_update_request(priv->gvnc, 0, 0, 0, priv->fb.width, priv->fb.height))
 		goto cleanup;
@@ -1685,6 +1706,19 @@ static void vnc_display_class_init(VncDisplayClass *klass)
 								G_PARAM_STATIC_NICK |
 								G_PARAM_STATIC_BLURB));
 	g_object_class_install_property (object_class,
+					 PROP_ENCODING,
+					 g_param_spec_enum (    "encoding",
+								"Encoding",
+								"The type of encoding used in the connection",
+								VNC_TYPE_DISPLAY_ENCODING,
+								VNC_DISPLAY_ENCODING_AUTO,
+								G_PARAM_READWRITE |
+								G_PARAM_CONSTRUCT |
+								G_PARAM_STATIC_NAME |
+								G_PARAM_STATIC_NICK |
+								G_PARAM_STATIC_BLURB));
+
+	g_object_class_install_property (object_class,
 					 PROP_SCALING,
 					 g_param_spec_boolean ( "scaling",
 								"Scaling",
@@ -1907,6 +1941,7 @@ static void vnc_display_init(VncDisplay *display)
 	priv->local_pointer = FALSE;
 	priv->shared_flag = FALSE;
 	priv->force_size = TRUE;
+	priv->encoding = VNC_DISPLAY_ENCODING_AUTO;
 
 	/*
 	 * Both these two provide TLS based auth, and can layer
@@ -2104,7 +2139,25 @@ void vnc_display_client_cut_text(VncDisplay *obj, const gchar *text)
 void vnc_display_set_lossy_encoding(VncDisplay *obj, gboolean enable)
 {
 	g_return_if_fail (VNC_IS_DISPLAY (obj));
+
+	if (obj->priv->allow_lossy == enable)
+		return;
 	obj->priv->allow_lossy = enable;
+
+	if (obj->priv->gvnc != NULL && gvnc_is_open(obj->priv->gvnc))
+		vnc_display_send_encodings(obj);
+}
+
+void vnc_display_set_encoding(VncDisplay *obj, VncDisplayEncoding encoding)
+{
+	g_return_if_fail (VNC_IS_DISPLAY (obj));
+
+	if (encoding == obj->priv->encoding)
+		return;
+	obj->priv->encoding = encoding;
+
+	if (obj->priv->gvnc != NULL && gvnc_is_open(obj->priv->gvnc))
+		vnc_display_send_encodings(obj);
 }
 
 void vnc_display_set_shared_flag(VncDisplay *obj, gboolean shared)
diff --git a/src/vncdisplay.h b/src/vncdisplay.h
index f81da73..b9d9b02 100644
--- a/src/vncdisplay.h
+++ b/src/vncdisplay.h
@@ -87,6 +87,13 @@ enum {
 	VNC_DISPLAY_ENCODING_ZRLE = 16
 };
 
+typedef enum
+{
+	VNC_DISPLAY_ENCODING_SPEED,   /* Faster, but with low graphic quality */
+	VNC_DISPLAY_ENCODING_QUALITY, /* Better quality, but slower */
+	VNC_DISPLAY_ENCODING_AUTO     /* Automatically choose the best option -- NOT IMPLEMENTED */
+} VncDisplayEncoding;
+
 G_BEGIN_DECLS
 
 GType		vnc_display_get_type(void);
@@ -129,6 +136,9 @@ void		vnc_display_client_cut_text(VncDisplay *obj, const gchar *text);
 void		vnc_display_set_lossy_encoding(VncDisplay *obj, gboolean enable);
 gboolean	vnc_display_get_lossy_encoding(VncDisplay *obj);
 
+void		vnc_display_set_encoding(VncDisplay *obj, VncDisplayEncoding encoding);
+VncDisplayEncoding vnc_display_get_encoding(VncDisplay *obj);
+
 int		vnc_display_get_last_encoding(VncDisplay *obj);
 
 gboolean	vnc_display_set_scaling(VncDisplay *obj, gboolean enable);



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