[gtk-vnc] src: add support for desktop rename
- From: Daniel P. Berrange <dberrange src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk-vnc] src: add support for desktop rename
- Date: Fri, 11 Dec 2020 18:26:13 +0000 (UTC)
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]