[gtk-vnc] src: add support for desktop rename



commit d3cd10dd6f6b7a07dafe1784ce343c64eb861a8a
Author: Daniel P. Berrangé <dan berrange com>
Date:   Fri Dec 11 15:08:38 2020 +0000

    src: add support for desktop rename
    
    Desktop rename allows the remote server to change the name associated
    with a desktop.
    
    Signed-off-by: Daniel P. Berrangé <berrange redhat com>

 src/vncconnection.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/vncconnection.h |  4 +++-
 src/vncdisplay.c    | 28 ++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+), 1 deletion(-)
---
diff --git a/src/vncconnection.c b/src/vncconnection.c
index c3c9728..00c5c8e 100644
--- a/src/vncconnection.c
+++ b/src/vncconnection.c
@@ -264,6 +264,7 @@ enum {
     VNC_SERVER_CUT_TEXT,
     VNC_FRAMEBUFFER_UPDATE,
     VNC_DESKTOP_RESIZE,
+    VNC_DESKTOP_RENAME,
     VNC_PIXEL_FORMAT_CHANGED,
     VNC_LED_STATE,
     VNC_POWER_CONTROL_INITIALIZED,
@@ -552,6 +553,13 @@ static gboolean do_vnc_connection_emit_main_context(gpointer opaque)
                       data->params.size.height);
         break;
 
+    case VNC_DESKTOP_RENAME:
+        g_signal_emit(G_OBJECT(data->conn),
+                      signals[data->signum],
+                      0,
+                      data->params.message);
+        break;
+
     case VNC_PIXEL_FORMAT_CHANGED:
         g_signal_emit(G_OBJECT(data->conn),
                       signals[data->signum],
@@ -3256,6 +3264,32 @@ static void vnc_connection_ext_key_event(VncConnection *conn)
     priv->has_ext_key_event = TRUE;
 }
 
+static void vnc_connection_desktop_name(VncConnection *conn)
+{
+    VncConnectionPrivate *priv = conn->priv;
+    guint32 n_name;
+    struct signal_data s;
+
+    VNC_DEBUG("Desktop name change");
+    n_name = vnc_connection_read_u32(conn);
+    if (vnc_connection_has_error(conn))
+        return;
+    if (n_name > 4096) {
+        vnc_connection_set_error(conn, "Name length %u too long",
+                                 n_name);
+        return;
+    }
+
+    g_free(priv->name);
+    priv->name = g_new(char, n_name + 1);
+
+    vnc_connection_read(conn, priv->name, n_name);
+    priv->name[n_name] = 0;
+    VNC_DEBUG("Display name '%s'", priv->name);
+    s.params.message = priv->name;
+    vnc_connection_emit_main_context(conn, VNC_DESKTOP_RENAME, &s);
+}
+
 
 static gboolean vnc_connection_framebuffer_update(VncConnection *conn, gint32 etype,
                                                   guint16 x, guint16 y,
@@ -3350,6 +3384,10 @@ static gboolean vnc_connection_framebuffer_update(VncConnection *conn, gint32 et
         if (priv->audio_enable_pending)
             vnc_connection_audio_enable(conn);
         break;
+    case VNC_CONNECTION_ENCODING_DESKTOP_NAME:
+        vnc_connection_desktop_name(conn);
+        vnc_connection_resend_framebuffer_update_request(conn);
+        break;
     case VNC_CONNECTION_ENCODING_ALPHA_CURSOR:
         vnc_connection_alpha_cursor(conn, x, y, width, height);
         vnc_connection_resend_framebuffer_update_request(conn);
@@ -5199,6 +5237,17 @@ static void vnc_connection_class_init(VncConnectionClass *klass)
                       G_TYPE_INT,
                       G_TYPE_INT);
 
+    signals[VNC_DESKTOP_RENAME] =
+        g_signal_new ("vnc-desktop-rename",
+                      G_OBJECT_CLASS_TYPE (object_class),
+                      G_SIGNAL_RUN_FIRST,
+                      G_STRUCT_OFFSET (VncConnectionClass, vnc_desktop_rename),
+                      NULL, NULL,
+                      g_cclosure_marshal_VOID__STRING,
+                      G_TYPE_NONE,
+                      1,
+                      G_TYPE_STRING);
+
     signals[VNC_PIXEL_FORMAT_CHANGED] =
         g_signal_new ("vnc-pixel-format-changed",
                       G_OBJECT_CLASS_TYPE (object_class),
diff --git a/src/vncconnection.h b/src/vncconnection.h
index 85041e1..11b0118 100644
--- a/src/vncconnection.h
+++ b/src/vncconnection.h
@@ -82,12 +82,13 @@ struct _VncConnectionClass
     void (*vnc_error)(VncConnection *conn, const char *message);
     void (*vnc_power_control_initialized)(VncConnection *conn);
     void (*vnc_power_control_failed)(VncConnection *conn);
+    void (*vnc_desktop_rename)(VncConnection *conn, const char *name);
 
     /*
      * If adding fields to this struct, remove corresponding
      * amount of padding to avoid changing overall struct size
      */
-    gpointer _vnc_reserved[VNC_PADDING_LARGE - 4];
+    gpointer _vnc_reserved[VNC_PADDING_LARGE - 5];
 };
 
 
@@ -126,6 +127,7 @@ typedef enum {
     VNC_CONNECTION_ENCODING_AUDIO = -259,
     VNC_CONNECTION_ENCODING_LED_STATE = -261,
 
+    VNC_CONNECTION_ENCODING_DESKTOP_NAME = -307,
     VNC_CONNECTION_ENCODING_XVP = -309,
     VNC_CONNECTION_ENCODING_ALPHA_CURSOR = -314,
 } VncConnectionEncoding;
diff --git a/src/vncdisplay.c b/src/vncdisplay.c
index 67f8854..229c1f3 100644
--- a/src/vncdisplay.c
+++ b/src/vncdisplay.c
@@ -132,6 +132,7 @@ typedef enum
         VNC_AUTH_CREDENTIAL,
 
         VNC_DESKTOP_RESIZE,
+        VNC_DESKTOP_RENAME,
 
         VNC_AUTH_FAILURE,
         VNC_AUTH_UNSUPPORTED,
@@ -1274,6 +1275,18 @@ static void on_pixel_format_changed(VncConnection *conn G_GNUC_UNUSED,
     vnc_connection_framebuffer_update_request(priv->conn, 0, 0, 0, width, height);
 }
 
+static void on_desktop_rename(VncConnection *conn G_GNUC_UNUSED,
+                              const char *name,
+                              gpointer opaque)
+{
+    VncDisplay *obj = VNC_DISPLAY(opaque);
+
+    g_signal_emit(G_OBJECT(obj),
+                  signals[VNC_DESKTOP_RENAME],
+                  0,
+                  name);
+}
+
 static gboolean vnc_display_set_preferred_pixel_format(VncDisplay *display)
 {
     VncDisplayPrivate *priv = display->priv;
@@ -1634,6 +1647,7 @@ static void on_initialized(VncConnection *conn G_GNUC_UNUSED,
                             VNC_CONNECTION_ENCODING_EXT_KEY_EVENT,
                             VNC_CONNECTION_ENCODING_LED_STATE,
                             VNC_CONNECTION_ENCODING_DESKTOP_RESIZE,
+                            VNC_CONNECTION_ENCODING_DESKTOP_NAME,
                             VNC_CONNECTION_ENCODING_LAST_RECT,
                             VNC_CONNECTION_ENCODING_WMVi,
                             VNC_CONNECTION_ENCODING_AUDIO,
@@ -2394,6 +2408,18 @@ static void vnc_display_class_init(VncDisplayClass *klass)
                      2,
                      G_TYPE_INT, G_TYPE_INT);
 
+    signals[VNC_DESKTOP_RENAME] =
+        g_signal_new("vnc-desktop-rename",
+                     G_TYPE_FROM_CLASS(klass),
+                     G_SIGNAL_RUN_LAST | G_SIGNAL_NO_HOOKS,
+                     0,
+                     NULL,
+                     NULL,
+                     g_cclosure_marshal_VOID__STRING,
+                     G_TYPE_NONE,
+                     1,
+                     G_TYPE_STRING);
+
     signals[VNC_AUTH_FAILURE] =
         g_signal_new("vnc-auth-failure",
                      G_TYPE_FROM_CLASS(klass),
@@ -2568,6 +2594,8 @@ static void vnc_display_init(VncDisplay *display)
                      G_CALLBACK(on_framebuffer_update), display);
     g_signal_connect(G_OBJECT(priv->conn), "vnc-desktop-resize",
                      G_CALLBACK(on_desktop_resize), display);
+    g_signal_connect(G_OBJECT(priv->conn), "vnc-desktop-rename",
+                     G_CALLBACK(on_desktop_rename), display);
     g_signal_connect(G_OBJECT(priv->conn), "vnc-pixel-format-changed",
                      G_CALLBACK(on_pixel_format_changed), display);
     g_signal_connect(G_OBJECT(priv->conn), "vnc-auth-failure",


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