[gtk-vnc/encoding: 4/4] Added [gs]et_encoding to VncDisplay.
- From: Jonh Wendell <jwendell src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtk-vnc/encoding: 4/4] Added [gs]et_encoding to VncDisplay.
- Date: Mon, 31 Aug 2009 20:17:12 +0000 (UTC)
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]