[PATCH RFC v2] Add support for LED state extension to gvnc



Hi guys,

As we are trying to add LED state extension to VNC protocol, and
the implementation for Qemu VNC server has already upstream. We'd
like to send out this patch, which tries to add support to gvnc,
please let me know if there is anything need to be addressed.

The proposal and patch series for detail:

https://lists.gnu.org/archive/html/qemu-devel/2013-04/msg04990.html

Thanks!

Changes since v1:
  Add signal callback vnc_led_state().


Signed-off-by: Lei Li <lilei linux vnet ibm com>
---
 src/libgvnc_sym.version |    1 +
 src/vncconnection.c     |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 src/vncconnection.h     |    3 +++
 3 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/src/libgvnc_sym.version b/src/libgvnc_sym.version
index 9adec25..20593ba 100644
--- a/src/libgvnc_sym.version
+++ b/src/libgvnc_sym.version
@@ -87,6 +87,7 @@
        vnc_connection_set_audio_format;
        vnc_connection_get_audio_format;
        vnc_connection_set_audio;
+        vnc_connection_get_ledstate;
 
        vnc_util_set_debug;
        vnc_util_get_debug;
diff --git a/src/vncconnection.c b/src/vncconnection.c
index 4b25a96..f86442c 100644
--- a/src/vncconnection.c
+++ b/src/vncconnection.c
@@ -217,6 +217,7 @@ struct _VncConnectionPrivate
     guint8 zrle_pi;
     int zrle_pi_bits;
 
+    int ledstate;
     gboolean has_ext_key_event;
 
     struct {
@@ -248,6 +249,7 @@ enum {
     VNC_FRAMEBUFFER_UPDATE,
     VNC_DESKTOP_RESIZE,
     VNC_PIXEL_FORMAT_CHANGED,
+    VNC_LED_STATE,
 
     VNC_AUTH_FAILURE,
     VNC_AUTH_UNSUPPORTED,
@@ -449,6 +451,7 @@ struct signal_data
         VncCursor *cursor;
         gboolean absPointer;
         const char *text;
+        int ledstate;
         struct {
             int x;
             int y;
@@ -525,6 +528,13 @@ static gboolean do_vnc_connection_emit_main_context(gpointer opaque)
                       data->params.pixelFormat);
         break;
 
+    case VNC_LED_STATE:
+        g_signal_emit(G_OBJECT(data->conn),
+                      signals[data->signum],
+                      0,
+                      data->params.ledstate);
+        break;
+
     case VNC_AUTH_FAILURE:
         g_signal_emit(G_OBJECT(data->conn),
                       signals[data->signum],
@@ -1415,6 +1425,21 @@ static void vnc_connection_read_pixel_format(VncConnection *conn, VncPixelFormat
               fmt->red_shift, fmt->green_shift, fmt->blue_shift);
 }
 
+static void vnc_connection_ledstate_change(VncConnection *conn)
+{
+    VncConnectionPrivate *priv = conn->priv;
+    struct signal_data sigdata;
+    int ledstate = 0;
+
+    priv->ledstate = vnc_connection_read_u8(conn);
+
+    VNC_DEBUG("LED state: %d\n", priv->ledstate);
+    sigdata.params.ledstate = priv->ledstate;
+    vnc_connection_emit_main_context(conn, VNC_LED_STATE, &sigdata);
+
+    ledstate = vnc_connection_get_ledstate(conn);
+}
+
 /* initialize function */
 
 gboolean vnc_connection_has_error(VncConnection *conn)
@@ -2884,6 +2909,10 @@ static gboolean vnc_connection_framebuffer_update(VncConnection *conn, gint32 et
         vnc_connection_pointer_type_change(conn, x);
         vnc_connection_resend_framebuffer_update_request(conn);
         break;
+    case VNC_CONNECTION_ENCODING_LED_STATE:
+        vnc_connection_ledstate_change(conn);
+        vnc_connection_resend_framebuffer_update_request(conn);
+        break;
     case VNC_CONNECTION_ENCODING_WMVi:
         vnc_connection_read_pixel_format(conn, &priv->fmt);
         vnc_connection_pixel_format(conn);
@@ -4609,6 +4638,16 @@ static void vnc_connection_class_init(VncConnectionClass *klass)
                       1,
                       G_TYPE_POINTER);
 
+    signals[VNC_LED_STATE] =
+        g_signal_new ("vnc-led-state",
+                      G_OBJECT_CLASS_TYPE (object_class),
+                      G_SIGNAL_RUN_FIRST,
+                      G_STRUCT_OFFSET (VncConnectionClass, vnc_led_state),
+                      NULL, NULL,
+                      g_cclosure_marshal_VOID__INT,
+                      G_TYPE_NONE,
+                      0);
+
     signals[VNC_AUTH_FAILURE] =
         g_signal_new ("vnc-auth-failure",
                       G_OBJECT_CLASS_TYPE (object_class),
@@ -5444,6 +5483,13 @@ gboolean vnc_connection_get_abs_pointer(VncConnection *conn)
     return priv->absPointer;
 }
 
+int vnc_connection_get_ledstate(VncConnection *conn)
+{
+    VncConnectionPrivate *priv = conn->priv;
+
+    return priv->ledstate;
+}
+
 /*
  * Local variables:
  *  c-indent-level: 4
diff --git a/src/vncconnection.h b/src/vncconnection.h
index cbfefd7..f2fc19b 100644
--- a/src/vncconnection.h
+++ b/src/vncconnection.h
@@ -65,6 +65,7 @@ struct _VncConnectionClass
     void (*vnc_framebuffer_update)(VncConnection *conn, guint16 x, guint16 y, guint16 width, guint16 height);
     void (*vnc_desktop_resize)(VncConnection *conn, guint16 width, guint16 height);
     void (*vnc_pixel_format_changed)(VncConnection *conn, VncPixelFormat *format);
+    void (*vnc_led_state)(VncConnection *conn);
     void (*vnc_auth_failure)(VncConnection *conn, const char *reason);
     void (*vnc_auth_unsupported)(VncConnection *conn, unsigned int authType);
     void (*vnc_auth_credential)(VncConnection *conn, GValueArray *creds);
@@ -114,6 +115,7 @@ typedef enum {
     VNC_CONNECTION_ENCODING_POINTER_CHANGE = -257,
     VNC_CONNECTION_ENCODING_EXT_KEY_EVENT = -258,
     VNC_CONNECTION_ENCODING_AUDIO = -259,
+    VNC_CONNECTION_ENCODING_LED_STATE = -261,
 } VncConnectionEncoding;
 
 typedef enum {
@@ -203,6 +205,7 @@ VncCursor *vnc_connection_get_cursor(VncConnection *conn);
 
 gboolean vnc_connection_get_abs_pointer(VncConnection *conn);
 gboolean vnc_connection_get_ext_key_event(VncConnection *conn);
+int vnc_connection_get_ledstate(VncConnection *conn);
 
 gboolean vnc_connection_set_audio(VncConnection *conn,
                                   VncAudio *audio);
-- 
1.7.7.6



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