From 69b45885bdbbdf94056ff11a69d8367af46f7082 Mon Sep 17 00:00:00 2001 From: Virtually Nick Date: Fri, 5 Apr 2024 17:21:06 -0400 Subject: [PATCH] GUACAMOLE-1760: Add guacd support for setting VNC compression and quality. --- src/protocols/vnc/settings.c | 24 ++++++++++++++++++++++++ src/protocols/vnc/settings.h | 10 ++++++++++ src/protocols/vnc/vnc.c | 7 +++++++ 3 files changed, 41 insertions(+) diff --git a/src/protocols/vnc/settings.c b/src/protocols/vnc/settings.c index 083a6c633..aa411047d 100644 --- a/src/protocols/vnc/settings.c +++ b/src/protocols/vnc/settings.c @@ -95,6 +95,8 @@ const char* GUAC_VNC_CLIENT_ARGS[] = { "wol-wait-time", "force-lossless", + "compress-level", + "quality-level", NULL }; @@ -389,6 +391,18 @@ enum VNC_ARGS_IDX { */ IDX_FORCE_LOSSLESS, + /** + * The level of compression, on a scale of 0 (no compression) to 9 (maximum + * compression), that the connection will be configured for. + */ + IDX_COMPRESS_LEVEL, + + /** + * The level of display quality, on a scale of 0 (worst quality) to 9 (best + * quality), that the connection will be configured for. + */ + IDX_QUALITY_LEVEL, + VNC_ARGS_COUNT }; @@ -453,6 +467,16 @@ guac_vnc_settings* guac_vnc_parse_args(guac_user* user, guac_user_parse_args_boolean(user, GUAC_VNC_CLIENT_ARGS, argv, IDX_FORCE_LOSSLESS, false); + /* Compression level */ + settings->compress_level = + guac_user_parse_args_int(user, GUAC_VNC_CLIENT_ARGS, argv, + IDX_COMPRESS_LEVEL, -1); + + /* Display quality */ + settings->quality_level = + guac_user_parse_args_int(user, GUAC_VNC_CLIENT_ARGS, argv, + IDX_QUALITY_LEVEL, -1); + #ifdef ENABLE_VNC_REPEATER /* Set repeater parameters if specified */ settings->dest_host = diff --git a/src/protocols/vnc/settings.h b/src/protocols/vnc/settings.h index 380343415..7ecd3700b 100644 --- a/src/protocols/vnc/settings.h +++ b/src/protocols/vnc/settings.h @@ -82,6 +82,16 @@ typedef struct guac_vnc_settings { */ bool lossless; + /** + * The level of compression to ask the VNC client library to perform. + */ + int compress_level; + + /** + * The quality level to ask the VNC client library to maintain. + */ + int quality_level; + #ifdef ENABLE_VNC_REPEATER /** * The VNC host to connect to, if using a repeater. diff --git a/src/protocols/vnc/vnc.c b/src/protocols/vnc/vnc.c index 9fd9156a8..85e97a13b 100644 --- a/src/protocols/vnc/vnc.c +++ b/src/protocols/vnc/vnc.c @@ -440,6 +440,13 @@ void* guac_vnc_client_thread(void* data) { * heuristics) */ guac_common_display_set_lossless(vnc_client->display, settings->lossless); + /* If compression and display quality have been configured, set those. */ + if (settings->compress_level >= 0 && settings->compress_level <= 9) + rfb_client->appData.compressLevel = settings->compress_level; + + if (settings->quality_level >= 0 && settings->quality_level <= 9) + rfb_client->appData.qualityLevel = settings->quality_level; + /* If not read-only, set an appropriate cursor */ if (settings->read_only == 0) { if (settings->remote_cursor)