From 29b76243b992824e4fa7490d394fd5c65e4cb324 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Fri, 12 Jun 2015 16:35:38 -0700 Subject: [PATCH] GUAC-835: Add support for all RDP performance flags. --- src/protocols/rdp/client.c | 20 ++++++++++++ src/protocols/rdp/rdp_settings.c | 53 ++++++++++++++++++++++++++++++++ src/protocols/rdp/rdp_settings.h | 41 ++++++++++++++++++++++++ 3 files changed, 114 insertions(+) diff --git a/src/protocols/rdp/client.c b/src/protocols/rdp/client.c index 7ba86224..b0966403 100644 --- a/src/protocols/rdp/client.c +++ b/src/protocols/rdp/client.c @@ -116,6 +116,12 @@ const char* GUAC_CLIENT_ARGS[] = { "remote-app-args", "static-channels", "client-name", + "enable-wallpaper", + "enable-theming", + "enable-font-smoothing", + "enable-full-window-drag", + "enable-desktop-composition", + "enable-menu-animations", NULL }; @@ -146,6 +152,12 @@ enum RDP_ARGS_IDX { IDX_REMOTE_APP_ARGS, IDX_STATIC_CHANNELS, IDX_CLIENT_NAME, + IDX_ENABLE_WALLPAPER, + IDX_ENABLE_THEMING, + IDX_ENABLE_FONT_SMOOTHING, + IDX_ENABLE_FULL_WINDOW_DRAG, + IDX_ENABLE_DESKTOP_COMPOSITION, + IDX_ENABLE_MENU_ANIMATIONS, RDP_ARGS_COUNT }; @@ -698,6 +710,14 @@ int guac_client_init(guac_client* client, int argc, char** argv) { if (argv[IDX_STATIC_CHANNELS][0] != '\0') settings->svc_names = guac_split(argv[IDX_STATIC_CHANNELS], ','); + /* Performance flags */ + settings->wallpaper_enabled = (strcmp(argv[IDX_ENABLE_WALLPAPER], "true") == 0); + settings->theming_enabled = (strcmp(argv[IDX_ENABLE_THEMING], "true") == 0); + settings->font_smoothing_enabled = (strcmp(argv[IDX_ENABLE_FONT_SMOOTHING], "true") == 0); + settings->full_window_drag_enabled = (strcmp(argv[IDX_ENABLE_FULL_WINDOW_DRAG], "true") == 0); + settings->desktop_composition_enabled = (strcmp(argv[IDX_ENABLE_DESKTOP_COMPOSITION], "true") == 0); + settings->menu_animations_enabled = (strcmp(argv[IDX_ENABLE_MENU_ANIMATIONS], "true") == 0); + /* Session color depth */ settings->color_depth = RDP_DEFAULT_DEPTH; if (argv[IDX_COLOR_DEPTH][0] != '\0') diff --git a/src/protocols/rdp/rdp_settings.c b/src/protocols/rdp/rdp_settings.c index 24064779..52471b9f 100644 --- a/src/protocols/rdp/rdp_settings.c +++ b/src/protocols/rdp/rdp_settings.c @@ -25,6 +25,7 @@ #include "rdp_settings.h" #include +#include #ifdef ENABLE_WINPR #include @@ -59,6 +60,51 @@ int guac_rdp_get_depth(freerdp* rdp) { #endif } +/** + * Given the settings structure of the Guacamole RDP client, calculates the + * standard performance flag value to send to the RDP server. The value of + * these flags is dictated by the RDP standard. + * + * @param guac_settings + * The settings structure to read performance settings from. + * + * @returns + * The standard RDP performance flag value representing the union of all + * performance settings within the given settings structure. + */ +static int guac_rdp_get_performance_flags(guac_rdp_settings* guac_settings) { + + /* No performance flags initially */ + int flags = PERF_FLAG_NONE; + + /* Desktop wallpaper */ + if (!guac_settings->wallpaper_enabled) + flags |= PERF_DISABLE_WALLPAPER; + + /* Theming of desktop/windows */ + if (!guac_settings->theming_enabled) + flags |= PERF_DISABLE_THEMING; + + /* Font smoothing (ClearType) */ + if (guac_settings->font_smoothing_enabled) + flags |= PERF_ENABLE_FONT_SMOOTHING; + + /* Full-window drag */ + if (!guac_settings->full_window_drag_enabled) + flags |= PERF_DISABLE_FULLWINDOWDRAG; + + /* Desktop composition (Aero) */ + if (guac_settings->desktop_composition_enabled) + flags |= PERF_ENABLE_DESKTOP_COMPOSITION; + + /* Menu animations */ + if (!guac_settings->menu_animations_enabled) + flags |= PERF_DISABLE_MENUANIMATIONS; + + return flags; + +} + void guac_rdp_push_settings(guac_rdp_settings* guac_settings, freerdp* rdp) { BOOL bitmap_cache; @@ -99,6 +145,13 @@ void guac_rdp_push_settings(guac_rdp_settings* guac_settings, freerdp* rdp) { rdp_settings->KeyboardLayout = guac_settings->server_layout->freerdp_keyboard_layout; #endif + /* Performance flags */ +#ifdef LEGACY_RDPSETTINGS + rdp_settings->performance_flags = guac_rdp_get_performance_flags(guac_settings); +#else + rdp_settings->PerformanceFlags = guac_rdp_get_performance_flags(guac_settings); +#endif + /* Client name */ if (guac_settings->client_name != NULL) { #ifdef LEGACY_RDPSETTINGS diff --git a/src/protocols/rdp/rdp_settings.h b/src/protocols/rdp/rdp_settings.h index be664801..b87e1cdf 100644 --- a/src/protocols/rdp/rdp_settings.h +++ b/src/protocols/rdp/rdp_settings.h @@ -219,6 +219,47 @@ typedef struct guac_rdp_settings { */ char** svc_names; + /** + * Whether the desktop wallpaper should be visible. If unset, the desktop + * wallpaper will be hidden, reducing the amount of bandwidth required. + */ + int wallpaper_enabled; + + /** + * Whether desktop and window theming should be allowed. If unset, theming + * is temporarily disabled on the desktop of the RDP server for the sake of + * performance, reducing the amount of bandwidth required. + */ + int theming_enabled; + + /** + * Whether glyphs should be smoothed with antialiasing (ClearType). If + * unset, glyphs will be rendered with sharp edges and using single colors, + * effectively 1-bit images, reducing the amount of bandwidth required. + */ + int font_smoothing_enabled; + + /** + * Whether windows contents should be shown as they are moved. If unset, + * only a window border will be shown during window move operations, + * reducing the amount of bandwidth required. + */ + int full_window_drag_enabled; + + /** + * Whether desktop composition (Aero) should be enabled during the session. + * As desktop composition provides alpha blending and other special + * effects, this increases the amount of bandwidth used. If unset, desktop + * composition will be disabled. + */ + int desktop_composition_enabled; + + /** + * Whether menu animations should be shown. If unset, menus will not be + * animated, reducing the amount of bandwidth required. + */ + int menu_animations_enabled; + } guac_rdp_settings; /**